summaryrefslogtreecommitdiff
path: root/epan/dissectors
diff options
context:
space:
mode:
authorAnders <anders.broman@ericsson.com>2015-02-16 10:53:05 +0100
committerAnders Broman <a.broman58@gmail.com>2015-02-16 09:57:18 +0000
commitb2d23ec2fb2fc314d4014b98cb324ae7c2f9b489 (patch)
tree0d52c9488503a93ed518991e9a4e09285f67dda8 /epan/dissectors
parent0ce7fd4be6892fe55c8a5635a78bdf6378363e6a (diff)
downloadwireshark-b2d23ec2fb2fc314d4014b98cb324ae7c2f9b489.tar.gz
[STUN] Avoid fetching stuff twice from the tvb.
Change-Id: I923818ea41791b2f41c5bce3c5927014580eb2b7 Reviewed-on: https://code.wireshark.org/review/7174 Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-stun.c88
1 files changed, 55 insertions, 33 deletions
diff --git a/epan/dissectors/packet-stun.c b/epan/dissectors/packet-stun.c
index 56524c71c6..402ae44ac2 100644
--- a/epan/dissectors/packet-stun.c
+++ b/epan/dissectors/packet-stun.c
@@ -515,9 +515,10 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
conversation_t *conversation=NULL;
stun_conv_info_t *stun_info;
stun_transaction_t *stun_trans;
- wmem_tree_key_t transaction_id_key[2];
- guint32 transaction_id[3];
- heur_dtbl_entry_t *hdtbl_entry;
+ wmem_tree_key_t transaction_id_key[2];
+ guint32 transaction_id[3];
+ heur_dtbl_entry_t *hdtbl_entry;
+ guint reported_length;
/*
* Check if the frame is really meant for us.
@@ -525,6 +526,7 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
/* First, make sure we have enough data to do the check. */
captured_length = tvb_captured_length(tvb);
+ reported_length = tvb_reported_length(tvb);
if (captured_length < MIN_HDR_LEN)
return 0;
@@ -533,7 +535,6 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
/* STUN Channel Data message ? */
if (msg_type & 0xC000) {
- guint reported_length = tvb_reported_length(tvb);
/* two first bits not NULL => should be a channel-data message */
if (msg_type == 0xFFFF)
@@ -572,7 +573,7 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
return 0;
/* check if payload enough */
- if (tvb_reported_length(tvb) != (msg_length + STUN_HDR_LEN))
+ if (reported_length != (msg_length + STUN_HDR_LEN))
return 0;
/* The message seems to be a valid STUN message! */
@@ -731,6 +732,7 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
if (msg_length != 0) {
guint offset;
+ const gchar *attribute_name_str;
ti = proto_tree_add_item(stun_tree, hf_stun_attributes, tvb, STUN_HDR_LEN, msg_length, ENC_NA);
att_all_tree = proto_item_add_subtree(ti, ett_stun_att_all);
@@ -740,10 +742,11 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
while (offset < (STUN_HDR_LEN + msg_length)) {
att_type = tvb_get_ntohs(tvb, offset); /* Type field in attribute header */
att_length = tvb_get_ntohs(tvb, offset+2); /* Length field in attribute header */
+ attribute_name_str = val_to_str_ext_const(att_type, &attributes_ext, "Unknown");
if(att_all_tree){
ti = proto_tree_add_uint_format(att_all_tree, hf_stun_attr,
tvb, offset, ATTR_HDR_LEN+att_length,
- att_type, "%s", val_to_str_ext_const(att_type, &attributes_ext, "Unknown"));
+ att_type, "%s", attribute_name_str);
att_tree = proto_item_add_subtree(ti, ett_stun_att);
ti = proto_tree_add_uint(att_tree, hf_stun_att_type, tvb,
offset, 2, att_type);
@@ -815,6 +818,10 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
case RESPONSE_ORIGIN:
case OTHER_ADDRESS:
case MS_ALT_MAPPED_ADDRESS:
+ {
+ const gchar *addr_str;
+ guint16 att_port;
+
if (att_length < 1)
break;
proto_tree_add_item(att_tree, hf_stun_att_reserved, tvb, offset, 1, ENC_NA);
@@ -824,18 +831,21 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
if (att_length < 4)
break;
proto_tree_add_item(att_tree, hf_stun_att_port, tvb, offset+2, 2, ENC_BIG_ENDIAN);
+ att_port = tvb_get_ntohs(tvb, offset + 2);
+
switch (tvb_get_guint8(tvb, offset+1)) {
case 1:
if (att_length < 8)
break;
+ addr_str = tvb_ip_to_str(tvb, offset + 4);
proto_tree_add_item(att_tree, hf_stun_att_ipv4, tvb, offset+4, 4, ENC_BIG_ENDIAN);
- proto_item_append_text(att_tree, ": %s:%d", tvb_ip_to_str(tvb,offset+4),tvb_get_ntohs(tvb,offset+2));
+ proto_item_append_text(att_tree, ": %s:%d", addr_str, att_port);
col_append_fstr(
pinfo->cinfo, COL_INFO,
" %s: %s:%d",
- val_to_str_ext_const(att_type, &attributes_ext, "Unknown"),
- tvb_ip_to_str(tvb,offset+4),
- tvb_get_ntohs(tvb,offset+2)
+ attribute_name_str,
+ addr_str,
+ att_port
);
break;
@@ -846,7 +856,7 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
break;
}
break;
-
+ }
case CHANGE_REQUEST:
if (att_length < 4)
break;
@@ -855,17 +865,22 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
break;
case USERNAME:
+ {
+ const gchar *user_name_str;
+
proto_tree_add_item(att_tree, hf_stun_att_username, tvb, offset, att_length, ENC_UTF_8|ENC_NA);
- proto_item_append_text(att_tree, ": %s", tvb_get_string_enc(wmem_packet_scope(), tvb, offset, att_length, ENC_UTF_8|ENC_NA));
+ user_name_str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, att_length, ENC_UTF_8 | ENC_NA);
+ proto_item_append_text(att_tree, ": %s", user_name_str);
col_append_fstr(
pinfo->cinfo, COL_INFO,
" user: %s",
- tvb_get_string_enc(wmem_packet_scope(), tvb, offset, att_length, ENC_UTF_8|ENC_NA));
+ user_name_str);
+
if (att_length % 4 != 0)
proto_tree_add_uint(att_tree, hf_stun_att_padding,
tvb, offset+att_length, 4-(att_length % 4), 4-(att_length % 4));
break;
-
+ }
case MESSAGE_INTEGRITY:
if (att_length < 20)
break;
@@ -883,31 +898,34 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
break;
proto_tree_add_item(att_tree, hf_stun_att_error_number, tvb, offset+3, 1, ENC_BIG_ENDIAN);
{
- int human_error_num = tvb_get_guint8(tvb, offset+2) * 100 + tvb_get_guint8(tvb, offset+3);
+ int human_error_num = tvb_get_guint8(tvb, offset+2) * 100 + tvb_get_guint8(tvb, offset+3);
+ const gchar *error_str = val_to_str_ext_const(human_error_num, &error_code_ext, "*Unknown error code*");
proto_item_append_text(
att_tree,
" %d (%s)",
human_error_num, /* human readable error code */
- val_to_str_ext_const(human_error_num, &error_code_ext, "*Unknown error code*")
+ error_str
);
col_append_fstr(
pinfo->cinfo, COL_INFO,
" error-code: %d (%s)",
human_error_num,
- val_to_str_ext_const(human_error_num, &error_code_ext, "*Unknown error code*")
+ error_str
);
}
if (att_length < 5)
break;
- proto_tree_add_item(att_tree, hf_stun_att_error_reason, tvb, offset+4, att_length-4, ENC_UTF_8|ENC_NA);
-
- proto_item_append_text(att_tree, ": %s", tvb_get_string_enc(wmem_packet_scope(), tvb, offset+4, att_length-4, ENC_UTF_8|ENC_NA));
- col_append_fstr(
- pinfo->cinfo, COL_INFO,
- " %s",
- tvb_get_string_enc(wmem_packet_scope(), tvb, offset+4, att_length-4, ENC_UTF_8|ENC_NA)
- );
-
+ proto_tree_add_item(att_tree, hf_stun_att_error_reason, tvb, offset + 4, att_length - 4, ENC_UTF_8 | ENC_NA);
+ {
+ const gchar *error_reas_str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 4, att_length - 4, ENC_UTF_8 | ENC_NA);
+
+ proto_item_append_text(att_tree, ": %s", error_reas_str);
+ col_append_fstr(
+ pinfo->cinfo, COL_INFO,
+ " %s",
+ error_reas_str
+ );
+ }
if (att_length % 4 != 0)
proto_tree_add_uint(att_tree, hf_stun_att_padding, tvb, offset+att_length, 4-(att_length % 4), 4-(att_length % 4));
@@ -921,17 +939,19 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
break;
case REALM:
+ {
+ const gchar *realm_str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, att_length, ENC_UTF_8 | ENC_NA);
proto_tree_add_item(att_tree, hf_stun_att_realm, tvb, offset, att_length, ENC_UTF_8|ENC_NA);
- proto_item_append_text(att_tree, ": %s", tvb_get_string_enc(wmem_packet_scope(), tvb, offset, att_length, ENC_UTF_8|ENC_NA));
+ proto_item_append_text(att_tree, ": %s", realm_str);
col_append_fstr(
pinfo->cinfo, COL_INFO,
" realm: %s",
- tvb_get_string_enc(wmem_packet_scope(), tvb,offset, att_length, ENC_UTF_8|ENC_NA)
+ realm_str
);
if (att_length % 4 != 0)
proto_tree_add_uint(att_tree, hf_stun_att_padding, tvb, offset+att_length, 4-(att_length % 4), 4-(att_length % 4));
break;
-
+ }
case NONCE:
proto_tree_add_item(att_tree, hf_stun_att_nonce, tvb, offset, att_length, ENC_UTF_8|ENC_NA);
proto_item_append_text(att_tree, ": %s", tvb_get_string_enc(wmem_packet_scope(), tvb, offset, att_length, ENC_UTF_8|ENC_NA));
@@ -996,7 +1016,7 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
col_append_fstr(
pinfo->cinfo, COL_INFO,
" %s: %s:%d",
- val_to_str_ext_const(att_type, &attributes_ext, "Unknown"),
+ attribute_name_str,
ipstr,
port
);
@@ -1113,11 +1133,13 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
{
guint8 protoCode = tvb_get_guint8(tvb, offset);
- proto_item_append_text(att_tree, ": %s", val_to_str(protoCode, transportnames, "Unknown (0x%8x)"));
+ const gchar *protoCode_str = val_to_str(protoCode, transportnames, "Unknown (0x%8x)");
+
+ proto_item_append_text(att_tree, ": %s", protoCode_str);
col_append_fstr(
pinfo->cinfo, COL_INFO,
" %s",
- val_to_str(protoCode, transportnames, "Unknown (0x%8x)")
+ protoCode_str
);
}
proto_tree_add_item(att_tree, hf_stun_att_reserved, tvb, offset+1, 3, ENC_NA);
@@ -1237,7 +1259,7 @@ dissect_stun_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboole
}
}
- return tvb_reported_length(tvb);
+ return reported_length;
}
static int