summaryrefslogtreecommitdiff
path: root/epan
diff options
context:
space:
mode:
authorMartin Kaiser <wireshark@kaiser.cx>2015-09-16 22:25:17 +0200
committerAnders Broman <a.broman58@gmail.com>2015-09-17 11:51:50 +0000
commita4c2a29a9cdfbe663e637649ae1dc8cc6f8e5c49 (patch)
tree48e396bf0b3b49f14e25174a035d6d7e86dedf94 /epan
parent5fa0bb2d0262d25526b67219a546b2844172769f (diff)
downloadwireshark-a4c2a29a9cdfbe663e637649ae1dc8cc6f8e5c49.tar.gz
[iax2] don't THROW() an exception from a dissector
in this case, it's enough to exit the switch block and try to continue with the next element we might now end up with ie_item==NULL after the switch, so replace the assertion with a check Change-Id: Id54346077eb8aa12b22575f3ab6fa80087f240ce Reviewed-on: https://code.wireshark.org/review/10549 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-iax2.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/epan/dissectors/packet-iax2.c b/epan/dissectors/packet-iax2.c
index 77d8cd1f87..14bfd5c39a 100644
--- a/epan/dissectors/packet-iax2.c
+++ b/epan/dissectors/packet-iax2.c
@@ -185,6 +185,7 @@ static gint ett_iax2_trunk_call = -1;
static expert_field ei_iax_too_many_transfers = EI_INIT;
static expert_field ei_iax_circuit_id_conflict = EI_INIT;
static expert_field ei_iax_peer_address_unsupported = EI_INIT;
+static expert_field ei_iax_invalid_len = EI_INIT;
static const fragment_items iax2_fragment_items = {
&ett_iax2_fragment,
@@ -1250,7 +1251,10 @@ static guint32 dissect_ies(tvbuff_t *tvb, packet_info *pinfo, guint32 offset,
/* do non-tree-dependent stuff first */
switch (ies_type) {
case IAX_IE_DATAFORMAT:
- if (ies_len != 4) THROW(ReportedBoundsError);
+ if (ies_len != 4) {
+ proto_tree_add_expert(iax_tree, pinfo, &ei_iax_invalid_len, tvb, offset+1, 1);
+ break;
+ }
ie_data -> dataformat = tvb_get_ntohl(tvb, offset+2);
break;
@@ -1321,7 +1325,10 @@ static guint32 dissect_ies(tvbuff_t *tvb, packet_info *pinfo, guint32 offset,
{
proto_tree *codec_tree;
- if (ies_len != 4) THROW(ReportedBoundsError);
+ if (ies_len != 4) {
+ proto_tree_add_expert(ies_tree, pinfo, &ei_iax_invalid_len, tvb, offset+1, 1);
+ break;
+ }
ie_item =
proto_tree_add_item(ies_tree, ie_hf,
@@ -1385,12 +1392,13 @@ static guint32 dissect_ies(tvbuff_t *tvb, packet_info *pinfo, guint32 offset,
default:
if (ie_hf != -1) {
- /* throw an error if the IE isn't the expected length */
- enum ftenum type = proto_registrar_get_nth(ie_hf)->type;
- gint explen = ftype_length(type);
- if (explen != 0 && ies_len != explen)
- THROW(ReportedBoundsError);
- switch (type) {
+ gint explen = proto_registrar_get_length(ie_hf);
+ if (explen != 0 && ies_len != explen) {
+ proto_tree_add_expert(ies_tree, pinfo, &ei_iax_invalid_len, tvb, offset+1, 1);
+ break;
+ }
+
+ switch (proto_registrar_get_ftype(ie_hf)) {
case FT_UINT8:
case FT_UINT16:
case FT_UINT24:
@@ -1463,12 +1471,9 @@ static guint32 dissect_ies(tvbuff_t *tvb, packet_info *pinfo, guint32 offset,
break;
}
- /* by now, we *really* ought to have added an item */
- DISSECTOR_ASSERT(ie_item != NULL);
-
/* Retrieve the text from the item we added, and append it to the main IE
* item */
- if (!PROTO_ITEM_IS_HIDDEN(ti)) {
+ if (ie_item && !PROTO_ITEM_IS_HIDDEN(ti)) {
field_info *ie_finfo = PITEM_FINFO(ie_item);
/* if the representation of the item has already been set, use that;
@@ -3176,6 +3181,7 @@ proto_register_iax2(void)
{ &ei_iax_too_many_transfers, { "iax2.too_many_transfers", PI_PROTOCOL, PI_WARN, "Too many transfers for iax_call", EXPFILL }},
{ &ei_iax_circuit_id_conflict, { "iax2.circuit_id_conflict", PI_PROTOCOL, PI_WARN, "Circuit ID conflict", EXPFILL }},
{ &ei_iax_peer_address_unsupported, { "iax2.peer_address_unsupported", PI_PROTOCOL, PI_WARN, "Peer address unsupported", EXPFILL }},
+ { &ei_iax_invalid_len, { "iax2.invalid_len", PI_PROTOCOL, PI_WARN, "Invalid length", EXPFILL }}
};
expert_module_t* expert_iax;