aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gsm_sms.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-11-28 21:59:02 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-11-28 21:59:02 +0000
commit37660f413b4839b75e1f7926ae4a10b3d7688d15 (patch)
treea9c65129dda64187fa4de26ca6ed77e7af5551a3 /epan/dissectors/packet-gsm_sms.c
parent710feed2e01326cd37c4d981fb42456bf31afa9f (diff)
Fix https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9478 :
GSM SMS User Data header fill bits are wrong when using a 7 bits ASCII / IA5 encoding svn path=/trunk/; revision=53631
Diffstat (limited to 'epan/dissectors/packet-gsm_sms.c')
-rw-r--r--epan/dissectors/packet-gsm_sms.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c
index 299ed8dda1..aa5a8fbf8b 100644
--- a/epan/dissectors/packet-gsm_sms.c
+++ b/epan/dissectors/packet-gsm_sms.c
@@ -2582,12 +2582,13 @@ 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 *udl, enum character_set cset, guint8 *fill_bits)
{
guint8 oct;
proto_item *udh_item;
proto_tree *udh_subtree;
- static const guint8 fill_bits_mask[7] = { 0x0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f };
+ static const guint8 fill_bits_mask_gsm[7] = { 0x0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f };
+ static const guint8 fill_bits_mask_ascii[7] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc };
/* step over header */
@@ -2613,7 +2614,7 @@ dis_field_udh(tvbuff_t *tvb, proto_tree *tree, guint32 *offset, guint32 *length,
*offset += oct;
*length -= oct;
- if (uncomp_7bits)
+ if (cset != OTHER)
{
/* step over fill bits ? */
@@ -2623,7 +2624,14 @@ dis_field_udh(tvbuff_t *tvb, proto_tree *tree, guint32 *offset, guint32 *length,
{
oct = tvb_get_guint8(tvb, *offset);
- other_decode_bitfield_value(bigbuf, oct, fill_bits_mask[*fill_bits], 8);
+ if (cset == GSM_7BITS)
+ {
+ other_decode_bitfield_value(bigbuf, oct, fill_bits_mask_gsm[*fill_bits], 8);
+ }
+ else
+ {
+ other_decode_bitfield_value(bigbuf, oct, fill_bits_mask_ascii[*fill_bits], 8);
+ }
proto_tree_add_text(udh_subtree,
tvb, *offset, 1,
"%s : Fill bits",
@@ -2675,7 +2683,7 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
if (udhi)
{
- dis_field_udh(tvb, subtree, &offset, &length, &udl, (seven_bit && !compressed), &fill_bits);
+ dis_field_udh(tvb, subtree, &offset, &length, &udl, (seven_bit && !compressed) ? GSM_7BITS : OTHER, &fill_bits);
}
if (g_frags > 1)