From 3fac48da689998ca0942ec2bdcb0dabd77e04a36 Mon Sep 17 00:00:00 2001 From: Martin Kaiser Date: Thu, 6 Apr 2017 21:50:53 +0200 Subject: [PATCH] raknet: re-structure raknet_dissect_system_address() Create the subtree first. Increment *offset as we process the fields. Change-Id: I03b6ba9a20541593b90ac7932aab5ac88538f640 Reviewed-on: https://code.wireshark.org/review/21167 Reviewed-by: Martin Kaiser Petri-Dish: Martin Kaiser Tested-by: Petri Dish Buildbot Reviewed-by: Michael Mann --- epan/dissectors/packet-raknet.c | 39 +++++++++++++++++---------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/epan/dissectors/packet-raknet.c b/epan/dissectors/packet-raknet.c index 520a7b95d9..5435cab421 100644 --- a/epan/dissectors/packet-raknet.c +++ b/epan/dissectors/packet-raknet.c @@ -276,7 +276,13 @@ raknet_dissect_system_address(proto_tree *tree, int hf, tvbuff_t *tvb, gint *off address addr; gchar *addr_str; + /* XXX - does it really make sense to have a string hf that's set to + an empty string? */ + ti = proto_tree_add_string(tree, hf, tvb, *offset, -1, ""); + sub_tree = proto_item_add_subtree(ti, ett_raknet_system_address); ip_version = tvb_get_guint8(tvb, *offset); + proto_tree_add_item(sub_tree, hf_raknet_ip_version, tvb, *offset, 1, ENC_NA); + (*offset)++; switch (ip_version) { case 4: /* @@ -284,31 +290,26 @@ raknet_dissect_system_address(proto_tree *tree, int hf, tvbuff_t *tvb, gint *off * changing them. See ..RakNet/Source/BitStream.h * (BitStream::Write) */ - v4_addr = ~tvb_get_ipv4(tvb, *offset + 1); - port = tvb_get_ntohs(tvb, *offset + 1 + 4); - + v4_addr = ~tvb_get_ipv4(tvb, *offset); set_address(&addr, AT_IPv4, sizeof(v4_addr), &v4_addr); addr_str = address_to_display(wmem_packet_scope(), &addr); - - ti = proto_tree_add_string_format_value(tree, hf, tvb, *offset, 1 + 4 + 2, - "", "%s:%" G_GUINT16_FORMAT, addr_str, port); - sub_tree = proto_item_add_subtree(ti, ett_raknet_system_address); - proto_tree_add_item(sub_tree, hf_raknet_ip_version, tvb, *offset, 1, ENC_NA); proto_tree_add_ipv4(sub_tree, hf_raknet_ipv4_address, tvb, *offset + 1, 4, v4_addr); - proto_tree_add_item(sub_tree, hf_raknet_port, tvb, *offset + 1 + 4, 2, ENC_BIG_ENDIAN); - *offset += 1 + 4 + 2; + *offset += 4; + port = tvb_get_ntohs(tvb, *offset); + proto_tree_add_item(sub_tree, hf_raknet_port, tvb, *offset, 2, ENC_BIG_ENDIAN); + *offset += 2; + proto_item_set_len(ti, 1 + 4 + 2); + proto_item_append_text(ti, "%s:%" G_GUINT16_FORMAT, addr_str, port); break; case 6: - addr_str = tvb_ip6_to_str(tvb, *offset + 1); - port = tvb_get_ntohs(tvb, *offset + 1 + 16); - - ti = proto_tree_add_string_format_value(tree, hf, tvb, *offset, 1 + 16 + 2, - "", "[%s]:%" G_GUINT16_FORMAT, addr_str, port); - sub_tree = proto_item_add_subtree(ti, ett_raknet_system_address); - proto_tree_add_item(sub_tree, hf_raknet_ip_version, tvb, *offset, 1, ENC_NA); + addr_str = tvb_ip6_to_str(tvb, *offset); proto_tree_add_item(sub_tree, hf_raknet_ipv6_address, tvb, *offset + 1, 16, ENC_NA); - proto_tree_add_item(sub_tree, hf_raknet_port, tvb, *offset + 1 + 16, 2, ENC_BIG_ENDIAN); - *offset += 1 + 16 + 2; + *offset += 16; + port = tvb_get_ntohs(tvb, *offset); + proto_tree_add_item(sub_tree, hf_raknet_port, tvb, *offset, 2, ENC_BIG_ENDIAN); + *offset += 2; + proto_item_set_len(ti, 1 + 16 + 2); + proto_item_append_text(ti, "[%s]:%" G_GUINT16_FORMAT, addr_str, port); break; default: THROW(ReportedBoundsError);