aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gnutella.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2005-01-14 12:20:03 +0000
committerGuy Harris <guy@alum.mit.edu>2005-01-14 12:20:03 +0000
commit94ecf93f8a69efc31edbb5a936cf98346e532737 (patch)
tree2da266e240292332225e2a9a04f7fa1e557593e5 /epan/dissectors/packet-gnutella.c
parent0955a2c27bbb24089f225832ee5d598739499980 (diff)
Fix indentation.
Catch size values >= 0x80000000 and throw an exception rather than crashing with an assertion. svn path=/trunk/; revision=13032
Diffstat (limited to 'epan/dissectors/packet-gnutella.c')
-rw-r--r--epan/dissectors/packet-gnutella.c171
1 files changed, 98 insertions, 73 deletions
diff --git a/epan/dissectors/packet-gnutella.c b/epan/dissectors/packet-gnutella.c
index a88301eb5d..9efb0183d2 100644
--- a/epan/dissectors/packet-gnutella.c
+++ b/epan/dissectors/packet-gnutella.c
@@ -488,79 +488,104 @@ static void dissect_gnutella(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
GNUTELLA_LONG_LENGTH,
size);
- if (size > 0) {
-
- switch(payload_descriptor) {
- case GNUTELLA_PONG:
- pi = proto_tree_add_item(
- gnutella_header_tree,
- hf_gnutella_pong_payload,
- tvb,
- offset + GNUTELLA_HEADER_LENGTH,
- size,
- FALSE);
- gnutella_pong_tree = proto_item_add_subtree(
- pi,
- ett_gnutella);
- dissect_gnutella_pong(
- tvb,
- offset + GNUTELLA_HEADER_LENGTH,
- gnutella_pong_tree,
- size);
- break;
- case GNUTELLA_PUSH:
- pi = proto_tree_add_item(
- gnutella_header_tree,
- hf_gnutella_push_payload,
- tvb,
- offset + GNUTELLA_HEADER_LENGTH,
- size,
- FALSE);
- gnutella_push_tree = proto_item_add_subtree(
- pi,
- ett_gnutella);
- dissect_gnutella_push(
- tvb,
- offset + GNUTELLA_HEADER_LENGTH,
- gnutella_push_tree,
- size);
- break;
- case GNUTELLA_QUERY:
- pi = proto_tree_add_item(
- gnutella_header_tree,
- hf_gnutella_query_payload,
- tvb,
- offset + GNUTELLA_HEADER_LENGTH,
- size,
- FALSE);
- gnutella_query_tree = proto_item_add_subtree(
- pi,
- ett_gnutella);
- dissect_gnutella_query(
- tvb,
- offset + GNUTELLA_HEADER_LENGTH,
- gnutella_query_tree,
- size);
- break;
- case GNUTELLA_QUERYHIT:
- pi = proto_tree_add_item(
- gnutella_header_tree,
- hf_gnutella_queryhit_payload,
- tvb,
- offset + GNUTELLA_HEADER_LENGTH,
- size,
- FALSE);
- gnutella_queryhit_tree = proto_item_add_subtree(
- pi,
- ett_gnutella);
- dissect_gnutella_queryhit(
- tvb,
- offset + GNUTELLA_HEADER_LENGTH,
- gnutella_queryhit_tree,
- size);
- break;
- }
- }
+ if (size > 0) {
+ /*
+ * XXX - the size argument to
+ * "proto_tree_add_item()" is signed,
+ * to allow -1 to be used to mean
+ * "to the end of the packet.
+ *
+ * Unfortunately, this means that
+ * an unsigned 32-bit value could
+ * be interpreted as a negative
+ * number, which causes an
+ * assertion error if it's not 0xFFFFFFFF
+ * (-1).
+ *
+ * So we use "tvb_ensure_bytes_exist()"
+ * so that we throw an exception if
+ * not all the data is available - or if
+ * it's >= 0x80000000, i.e. if it looks
+ * like a negative number, as if it's
+ * >= 0x80000000 it's *definitely past
+ * the end of the tvbuff, because we
+ * don't have tvbuffs with >2GB of
+ * data.
+ */
+ tvb_ensure_bytes_exist(tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ size);
+ switch(payload_descriptor) {
+ case GNUTELLA_PONG:
+ pi = proto_tree_add_item(
+ gnutella_header_tree,
+ hf_gnutella_pong_payload,
+ tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ size,
+ FALSE);
+ gnutella_pong_tree = proto_item_add_subtree(
+ pi,
+ ett_gnutella);
+ dissect_gnutella_pong(
+ tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ gnutella_pong_tree,
+ size);
+ break;
+ case GNUTELLA_PUSH:
+ pi = proto_tree_add_item(
+ gnutella_header_tree,
+ hf_gnutella_push_payload,
+ tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ size,
+ FALSE);
+ gnutella_push_tree = proto_item_add_subtree(
+ pi,
+ ett_gnutella);
+ dissect_gnutella_push(
+ tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ gnutella_push_tree,
+ size);
+ break;
+ case GNUTELLA_QUERY:
+ pi = proto_tree_add_item(
+ gnutella_header_tree,
+ hf_gnutella_query_payload,
+ tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ size,
+ FALSE);
+ gnutella_query_tree = proto_item_add_subtree(
+ pi,
+ ett_gnutella);
+ dissect_gnutella_query(
+ tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ gnutella_query_tree,
+ size);
+ break;
+ case GNUTELLA_QUERYHIT:
+ pi = proto_tree_add_item(
+ gnutella_header_tree,
+ hf_gnutella_queryhit_payload,
+ tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ size,
+ FALSE);
+ gnutella_queryhit_tree = proto_item_add_subtree(
+ pi,
+ ett_gnutella);
+ dissect_gnutella_queryhit(
+ tvb,
+ offset + GNUTELLA_HEADER_LENGTH,
+ gnutella_queryhit_tree,
+ size);
+ break;
+ }
+ }
offset = offset + GNUTELLA_HEADER_LENGTH + size;
}