diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2013-06-02 20:57:48 +0000 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2013-06-02 20:57:48 +0000 |
commit | b0646c07565f82366ce781aeadce24dd4fc6c834 (patch) | |
tree | 77a7674a27f89a630ad2b8f01aeb11432b9491a3 /epan/dissectors/packet-gsm_sms.c | |
parent | 3922276de4aea822f7445d47333e9718f1aa5510 (diff) |
Fix https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8756 :
Compute the number of septets needed for an alphanumeric address
svn path=/trunk/; revision=49698
Diffstat (limited to 'epan/dissectors/packet-gsm_sms.c')
-rw-r--r-- | epan/dissectors/packet-gsm_sms.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c index 640313c1f2..a29529f44d 100644 --- a/epan/dissectors/packet-gsm_sms.c +++ b/epan/dissectors/packet-gsm_sms.c @@ -339,15 +339,15 @@ dis_field_addr(tvbuff_t *tvb, proto_tree *tree, guint32 *offset_p, const gchar * guint8 oct; guint32 offset; guint32 numdigocts; - guint32 length; + guint32 length, addrlength; guint32 i, j; char addrbuf[MAX_ADDR_SIZE+1]; gchar *addrstr; offset = *offset_p; - oct = tvb_get_guint8(tvb, offset); - numdigocts = (oct + 1) / 2; + addrlength = tvb_get_guint8(tvb, offset); + numdigocts = (addrlength + 1) / 2; length = tvb_length_remaining(tvb, offset); @@ -371,7 +371,7 @@ dis_field_addr(tvbuff_t *tvb, proto_tree *tree, guint32 *offset_p, const gchar * proto_tree_add_text(subtree, tvb, offset, 1, "Length: %d address digits", - oct); + addrlength); offset++; oct = tvb_get_guint8(tvb, offset); @@ -433,7 +433,9 @@ dis_field_addr(tvbuff_t *tvb, proto_tree *tree, guint32 *offset_p, const gchar * switch ((oct & 0x70) >> 4) { case 0x05: /* "Alphanumeric (coded according to 3GPP TS 23.038 GSM 7-bit default alphabet)" */ - i = gsm_sms_char_7bit_unpack(0, numdigocts, MAX_ADDR_SIZE, tvb_get_ptr(tvb, offset, numdigocts), addrbuf); + addrlength = (addrlength << 2) / 7; + i = gsm_sms_char_7bit_unpack(0, numdigocts, ((addrlength > MAX_ADDR_SIZE) ? MAX_ADDR_SIZE : addrlength), + tvb_get_ptr(tvb, offset, numdigocts), addrbuf); addrbuf[i] = '\0'; addrstr = gsm_sms_chars_to_utf8(addrbuf, i); break; |