raknet: don't THROW() an exception from a dissector

Show an expert info and return from raknet_dissect_system_address().

Change-Id: Icedab5f1956d4b4c60318a1dd4f65bc7078d4e20
Reviewed-on: https://code.wireshark.org/review/21168
Reviewed-by: Michael Mann <mmann78@netscape.net>
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Martin Kaiser <wireshark@kaiser.cx>
This commit is contained in:
Martin Kaiser 2017-04-17 19:50:36 +02:00
parent c54afb89a2
commit 3c5183326b
1 changed files with 23 additions and 9 deletions

View File

@ -72,6 +72,7 @@ static heur_dissector_list_t raknet_heur_subdissectors = NULL;
static expert_field ei_raknet_unknown_message_id = EI_INIT;
static expert_field ei_raknet_encrypted_message = EI_INIT;
static expert_field ei_raknet_subdissector_failed = EI_INIT;
static expert_field ei_raknet_ip_ver_invalid = EI_INIT;
/*
* First byte gives us the packet id
@ -267,7 +268,8 @@ raknet_conversation_set_dissector(packet_info *pinfo, const dissector_handle_t h
}
static void
raknet_dissect_system_address(proto_tree *tree, int hf, tvbuff_t *tvb, gint *offset) {
raknet_dissect_system_address(proto_tree *tree, int hf,
packet_info *pinfo, tvbuff_t *tvb, gint *offset) {
proto_item *ti;
proto_tree *sub_tree;
guint8 ip_version;
@ -312,7 +314,8 @@ raknet_dissect_system_address(proto_tree *tree, int hf, tvbuff_t *tvb, gint *off
proto_item_append_text(ti, "[%s]:%" G_GUINT16_FORMAT, addr_str, port);
break;
default:
THROW(ReportedBoundsError);
proto_item_set_len(ti, 1);
expert_add_info(pinfo, sub_tree, &ei_raknet_ip_ver_invalid);
}
}
@ -441,7 +444,8 @@ raknet_dissect_open_connection_request_2(tvbuff_t *tvb, packet_info *pinfo, prot
}
}
raknet_dissect_system_address(sub_tree, hf_raknet_server_address, tvb, &offset);
raknet_dissect_system_address(
sub_tree, hf_raknet_server_address, pinfo, tvb, &offset);
proto_tree_add_item(sub_tree, hf_raknet_mtu_size, tvb, offset,
2, ENC_BIG_ENDIAN);
@ -472,7 +476,8 @@ raknet_dissect_open_connection_reply_2(tvbuff_t *tvb, packet_info *pinfo, proto_
8, ENC_NA);
offset += 8;
raknet_dissect_system_address(sub_tree, hf_raknet_client_address, tvb, &offset);
raknet_dissect_system_address(
sub_tree, hf_raknet_client_address, pinfo, tvb, &offset);
proto_tree_add_item(sub_tree, hf_raknet_mtu_size, tvb, offset,
2, ENC_BIG_ENDIAN);
@ -656,14 +661,16 @@ raknet_dissect_connection_request_accepted(tvbuff_t *tvb, packet_info *pinfo _U_
gint offset = 1;
gint i;
raknet_dissect_system_address(tree, hf_raknet_client_address, tvb, &offset);
raknet_dissect_system_address(
tree, hf_raknet_client_address, pinfo, tvb, &offset);
proto_tree_add_item(tree, hf_raknet_system_index, tvb, offset,
2, ENC_BIG_ENDIAN);
offset += 2;
for (i = 0; i < RAKNET_NUMBER_OF_INTERNAL_IDS; i++) {
raknet_dissect_system_address(tree, hf_raknet_internal_address, tvb, &offset);
raknet_dissect_system_address(
tree, hf_raknet_internal_address, pinfo, tvb, &offset);
}
proto_tree_add_item(tree, hf_raknet_timestamp, tvb,
@ -678,17 +685,19 @@ raknet_dissect_connection_request_accepted(tvbuff_t *tvb, packet_info *pinfo _U_
}
static int
raknet_dissect_new_incoming_connection(tvbuff_t *tvb, packet_info *pinfo _U_,
raknet_dissect_new_incoming_connection(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree, void* data _U_)
{
gint offset = 1;
gint i;
raknet_dissect_system_address(tree, hf_raknet_server_address, tvb, &offset);
raknet_dissect_system_address(
tree, hf_raknet_server_address, pinfo, tvb, &offset);
for (i = 0; i < RAKNET_NUMBER_OF_INTERNAL_IDS; i++) {
raknet_dissect_system_address(tree, hf_raknet_internal_address, tvb, &offset);
raknet_dissect_system_address(
tree, hf_raknet_internal_address, pinfo, tvb, &offset);
}
proto_tree_add_item(tree, hf_raknet_timestamp, tvb,
@ -1930,6 +1939,11 @@ proto_register_raknet(void)
"RakNet message subdissector failed, trying the next candidate or heuristics",
EXPFILL }
},
{ &ei_raknet_ip_ver_invalid,
{ "raknet.ip_version.invalid", PI_PROTOCOL, PI_WARN,
"Invalid IP version",
EXPFILL }
}
};
expert_module_t *expert_raknet;