aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gsm_sms.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-06-02 20:57:48 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-06-02 20:57:48 +0000
commitb0646c07565f82366ce781aeadce24dd4fc6c834 (patch)
tree77a7674a27f89a630ad2b8f01aeb11432b9491a3 /epan/dissectors/packet-gsm_sms.c
parent3922276de4aea822f7445d47333e9718f1aa5510 (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.c12
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;