aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-openwire.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2013-10-09 15:19:04 +0000
committerMichael Mann <mmann78@netscape.net>2013-10-09 15:19:04 +0000
commit65a8127832896340ea30e79cb3de394396727587 (patch)
treec2a17e23b21909ab572e47e4f250854273d51f3d /epan/dissectors/packet-openwire.c
parent9ccefb0ecd8cc95a24bed1223f70772444cd2a86 (diff)
Improve on r52458 and bugfix a few places where offset wasn't incrementing. Helps fix bug 9248 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9248) and should be good enough to backport.
svn path=/trunk/; revision=52463
Diffstat (limited to 'epan/dissectors/packet-openwire.c')
-rw-r--r--epan/dissectors/packet-openwire.c68
1 files changed, 32 insertions, 36 deletions
diff --git a/epan/dissectors/packet-openwire.c b/epan/dissectors/packet-openwire.c
index 819955ba50..92c04bad67 100644
--- a/epan/dissectors/packet-openwire.c
+++ b/epan/dissectors/packet-openwire.c
@@ -818,10 +818,11 @@ dissect_openwire_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int o
{
proto_tree_add_item(tree, hf_openwire_type_short, tvb, offset, 2, ENC_BIG_ENDIAN);
}
- if (tvb_length_remaining(tvb, offset) >= 2 + iStringLength)
+ offset += 2;
+ if (tvb_length_remaining(tvb, offset) >= iStringLength)
{
- proto_tree_add_item(tree, particularize(field, hf_openwire_type_string), tvb, offset + 2, iStringLength, ENC_NA);
- offset += 2 + iStringLength;
+ proto_tree_add_item(tree, particularize(field, hf_openwire_type_string), tvb, offset, iStringLength, ENC_NA);
+ offset += iStringLength;
}
}
else if (type == OPENWIRE_TYPE_BIG_STRING && tvb_length_remaining(tvb, offset) >= 4)
@@ -832,10 +833,11 @@ dissect_openwire_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int o
{
proto_tree_add_item(tree, hf_openwire_type_integer, tvb, offset, 4, ENC_BIG_ENDIAN);
}
- if (tvb_length_remaining(tvb, offset) >= 4 + iStringLength)
+ offset += 4;
+ if (tvb_length_remaining(tvb, offset) >= iStringLength)
{
- proto_tree_add_item(tree, particularize(field, hf_openwire_type_string), tvb, offset + 4, iStringLength, ENC_NA);
- offset += 4 + iStringLength;
+ proto_tree_add_item(tree, particularize(field, hf_openwire_type_string), tvb, offset, iStringLength, ENC_NA);
+ offset += iStringLength;
}
}
else if (type == OPENWIRE_TYPE_BYTE_ARRAY && tvb_length_remaining(tvb, offset) >= 4)
@@ -846,29 +848,30 @@ dissect_openwire_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int o
{
proto_tree_add_item(tree, hf_openwire_type_integer, tvb, offset, 4, ENC_BIG_ENDIAN);
}
- if (tvb_length_remaining(tvb, offset) >= 4 + iArrayLength)
+ offset += 4;
+ if (tvb_length_remaining(tvb, offset) >= iArrayLength)
{
proto_item * array_item = NULL;
proto_tree * object_tree = NULL;
- array_item = proto_tree_add_item(tree, particularize(field, hf_openwire_type_bytes), tvb, offset + 4, iArrayLength, ENC_NA);
+ array_item = proto_tree_add_item(tree, particularize(field, hf_openwire_type_bytes), tvb, offset, iArrayLength, ENC_NA);
object_tree = proto_item_add_subtree(array_item, ett_openwire_type);
if (field == hf_openwire_message_body)
{
tvbuff_t* next_tvb = NULL;
if (parentType == OPENWIRE_ACTIVEMQ_TEXT_MESSAGE)
{
- dissect_openwire_type(tvb, pinfo, object_tree, offset + 4, hf_openwire_none, OPENWIRE_TYPE_BIG_STRING, type, FALSE);
- next_tvb = tvb_new_subset(tvb, offset + 4, iArrayLength, iArrayLength);
+ dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_none, OPENWIRE_TYPE_BIG_STRING, type, FALSE);
+ next_tvb = tvb_new_subset(tvb, offset, iArrayLength, iArrayLength);
add_new_data_source(pinfo, next_tvb, "Body");
}
else if (parentType == OPENWIRE_ACTIVEMQ_MAP_MESSAGE)
{
- dissect_openwire_type(tvb, pinfo, object_tree, offset + 4, hf_openwire_none, OPENWIRE_TYPE_MAP, type, FALSE);
+ dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_none, OPENWIRE_TYPE_MAP, type, FALSE);
}
else if (parentType == OPENWIRE_ACTIVEMQ_STREAM_MESSAGE)
{
- gint streamOffset = offset + 4;
- while (streamOffset < offset + 4 + iArrayLength)
+ gint streamOffset = offset;
+ while (streamOffset < offset + iArrayLength)
{
streamOffset += dissect_openwire_type(tvb, pinfo, object_tree, streamOffset, hf_openwire_none, OPENWIRE_TYPE_NESTED, type, FALSE);
}
@@ -877,16 +880,16 @@ dissect_openwire_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int o
|| parentType == OPENWIRE_ACTIVEMQ_OBJECT_MESSAGE
|| parentType == OPENWIRE_ACTIVEMQ_BLOB_MESSAGE)
{
- next_tvb = tvb_new_subset(tvb, offset + 4, iArrayLength, iArrayLength);
+ next_tvb = tvb_new_subset(tvb, offset, iArrayLength, iArrayLength);
add_new_data_source(pinfo, next_tvb, "Body");
expert_add_info(pinfo, array_item, &ei_openwire_body_type_not_supported);
}
}
else if (field == hf_openwire_message_properties)
{
- dissect_openwire_type(tvb, pinfo, object_tree, offset + 4, hf_openwire_none, OPENWIRE_TYPE_MAP, type, FALSE);
+ dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_none, OPENWIRE_TYPE_MAP, type, FALSE);
}
- offset += 4 + iArrayLength;
+ offset += iArrayLength;
}
}
else if (tvb_length_remaining(tvb, offset) >= 1)
@@ -930,27 +933,20 @@ dissect_openwire_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int o
}
proto_item_append_text(ti, " (Size : %d)", iMapLength);
offset += 4;
- if (iMapLength > 0)
+ for (iMapItem = 0; (iMapItem < iMapLength) && (tvb_length_remaining(tvb, offset) > 0); iMapItem++)
{
- for (iMapItem = 0; iMapItem < iMapLength; iMapItem++)
- {
- proto_item * map_entry = NULL;
- proto_tree * entry_tree = NULL;
- map_entry = proto_tree_add_item(object_tree, hf_openwire_map_entry, tvb, offset, 0, ENC_NA);
- entry_tree = proto_item_add_subtree(map_entry, ett_openwire_type);
- if (tvb_length_remaining(tvb, offset) >= 0)
- {
- gint entryStartOffset = offset;
- /* Key */
- offset += dissect_openwire_type(tvb, pinfo, entry_tree, offset, hf_openwire_map_key, OPENWIRE_TYPE_STRING, type, FALSE);
- /* Value */
- offset += dissect_openwire_type(tvb, pinfo, entry_tree, offset, hf_openwire_none, OPENWIRE_TYPE_NESTED, type, FALSE);
- proto_item_set_len(map_entry, offset - entryStartOffset);
- if (offset - entryStartOffset <= 0) {
- break;
- }
- }
- }
+ proto_item * map_entry;
+ proto_tree * entry_tree;
+ gint entryStartOffset = offset;
+
+ map_entry = proto_tree_add_item(object_tree, hf_openwire_map_entry, tvb, offset, 0, ENC_NA);
+ entry_tree = proto_item_add_subtree(map_entry, ett_openwire_type);
+
+ /* Key */
+ offset += dissect_openwire_type(tvb, pinfo, entry_tree, offset, hf_openwire_map_key, OPENWIRE_TYPE_STRING, type, FALSE);
+ /* Value */
+ offset += dissect_openwire_type(tvb, pinfo, entry_tree, offset, hf_openwire_none, OPENWIRE_TYPE_NESTED, type, FALSE);
+ proto_item_set_len(map_entry, offset - entryStartOffset);
}
}
else if (type == OPENWIRE_TYPE_THROWABLE && tvb_length_remaining(tvb, offset) >= 2)