aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gsm_sms.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-06-12 16:59:59 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-06-12 16:59:59 +0000
commit0975d03e8df9b1dd24215ccec50fbb93d6f18a1f (patch)
treecf12d5d45948d43612123fbff35080adf945db08 /epan/dissectors/packet-gsm_sms.c
parent855870768130ba53bcaaa61b243b4ba79cf5edc1 (diff)
Fix dissection of 3GPP2 SMS messages when the User Data Header field is present (for fragmented SMS)
svn path=/trunk/; revision=49910
Diffstat (limited to 'epan/dissectors/packet-gsm_sms.c')
-rw-r--r--epan/dissectors/packet-gsm_sms.c111
1 files changed, 59 insertions, 52 deletions
diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c
index a29529f44d..b695aaaf01 100644
--- a/epan/dissectors/packet-gsm_sms.c
+++ b/epan/dissectors/packet-gsm_sms.c
@@ -2576,6 +2576,63 @@ dis_field_ud_iei(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 length)
}
}
+void
+dis_field_udh(tvbuff_t *tvb, proto_tree *tree, guint32 *offset, guint32 *length,
+ guint8 *udl, gboolean uncomp_7bits, guint8 *fill_bits)
+{
+ guint8 oct;
+ proto_item *udh_item;
+ proto_tree *udh_subtree = NULL;
+ static guint8 fill_bits_mask[7] = { 0x0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f };
+
+ /* step over header */
+
+ oct = tvb_get_guint8(tvb, *offset);
+
+ udh_item =
+ proto_tree_add_text(tree, tvb,
+ *offset, oct + 1,
+ "User-Data Header");
+
+ udh_subtree = proto_item_add_subtree(udh_item, ett_udh);
+
+ proto_tree_add_text(udh_subtree,
+ tvb, *offset, 1,
+ "User Data Header Length (%u)",
+ oct);
+
+ (*offset)++;
+ (*length)--;
+
+ dis_field_ud_iei(tvb, udh_subtree, *offset, oct);
+
+ *offset += oct;
+ *length -= oct;
+
+ if (uncomp_7bits)
+ {
+ /* step over fill bits ? */
+
+ *fill_bits = 6 - ((oct * 8) % 7);
+ *udl -= (((oct + 1)*8) + *fill_bits) / 7;
+ if (*fill_bits)
+ {
+ oct = tvb_get_guint8(tvb, *offset);
+
+ other_decode_bitfield_value(bigbuf, oct, fill_bits_mask[*fill_bits], 8);
+ proto_tree_add_text(udh_subtree,
+ tvb, *offset, 1,
+ "%s : Fill bits",
+ bigbuf);
+ /* Note: Could add an expert item here if ((oct & fill_bits_mask[*fill_bits]) != 0) */
+ }
+ }
+ else
+ {
+ *udl -= oct + 1;
+ }
+}
+
/* 9.2.3.24 */
#define SMS_MAX_MESSAGE_SIZE 160
static char messagebuf[SMS_MAX_MESSAGE_SIZE+1];
@@ -2583,15 +2640,11 @@ static void
dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, gboolean udhi, guint8 udl,
gboolean seven_bit, gboolean eight_bit, gboolean ucs2, gboolean compressed)
{
- static guint8 fill_bits_mask[7] =
- { 0x0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f };
proto_item *item;
- proto_item *udh_item;
proto_tree *subtree = NULL;
- proto_tree *udh_subtree = NULL;
tvbuff_t *sm_tvb = NULL;
fragment_data *fd_sm = NULL;
- guint8 oct, fill_bits;
+ guint8 fill_bits;
guint32 out_len, total_sms_len, len_sms, length_ucs2, i;
char *ustr;
proto_item *ucs2_item;
@@ -2616,55 +2669,9 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
"TP-User-Data");
subtree = proto_item_add_subtree(item, ett_ud);
- oct = tvb_get_guint8(tvb, offset);
-
if (udhi)
{
-
- /* step over header */
-
- udh_item =
- proto_tree_add_text(subtree, tvb,
- offset, oct + 1,
- "User-Data Header");
-
- udh_subtree = proto_item_add_subtree(udh_item, ett_udh);
-
- proto_tree_add_text(udh_subtree,
- tvb, offset, 1,
- "User Data Header Length (%u)",
- oct);
-
- offset++;
- length--;
-
- dis_field_ud_iei(tvb, udh_subtree, offset, oct);
-
- offset += oct;
- length -= oct;
-
- if (seven_bit && !compressed)
- {
- /* step over fill bits ? */
-
- fill_bits = 6 - ((oct * 8) % 7);
- udl -= (((oct + 1)*8) + fill_bits) / 7;
- if (fill_bits)
- {
- oct = tvb_get_guint8(tvb, offset);
-
- other_decode_bitfield_value(bigbuf, oct, fill_bits_mask[fill_bits], 8);
- proto_tree_add_text(udh_subtree,
- tvb, offset, 1,
- "%s : Fill bits",
- bigbuf);
- /* Note: Could add an expert item here if ((oct & fill_bits_mask[fill_bits]) != 0) */
- }
- }
- else
- {
- udl -= oct + 1;
- }
+ dis_field_udh(tvb, subtree, &offset, &length, &udl, (seven_bit && !compressed), &fill_bits);
}
if (g_frags > 1)