diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2013-11-28 21:59:02 +0000 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2013-11-28 21:59:02 +0000 |
commit | 37660f413b4839b75e1f7926ae4a10b3d7688d15 (patch) | |
tree | a9c65129dda64187fa4de26ca6ed77e7af5551a3 /epan/dissectors | |
parent | 710feed2e01326cd37c4d981fb42456bf31afa9f (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')
-rw-r--r-- | epan/dissectors/packet-ansi_637.c | 14 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_sms.c | 18 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_sms.h | 8 |
3 files changed, 27 insertions, 13 deletions
diff --git a/epan/dissectors/packet-ansi_637.c b/epan/dissectors/packet-ansi_637.c index 9810d34a9c..62a577412e 100644 --- a/epan/dissectors/packet-ansi_637.c +++ b/epan/dissectors/packet-ansi_637.c @@ -587,7 +587,7 @@ tele_param_user_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset = 0; bit = 0; if (*has_private_data == TRUE) { - dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, TRUE, &bit); + dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, ASCII_7BITS, &bit); } saved_offset = offset; @@ -649,7 +649,7 @@ tele_param_user_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset = 0; bit = 0; if (*has_private_data == TRUE) { - dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, TRUE, &bit); + dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, ASCII_7BITS, &bit); } saved_offset = offset; bit = bit ? bit : 8; @@ -678,7 +678,7 @@ tele_param_user_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint add_new_data_source(pinfo, tvb_out, "Characters"); offset = 0; if (*has_private_data == TRUE) { - dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, FALSE, &bit); + dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, OTHER, &bit); } if ((cd = g_iconv_open("UTF-8","UCS-2BE")) != (GIConv)-1) @@ -714,7 +714,7 @@ tele_param_user_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset = 0; required_octs = len - used; if (*has_private_data == TRUE) { - dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, FALSE, &bit); + dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, OTHER, &bit); } if ((cd = g_iconv_open("UTF-8","iso-8859-8")) != (GIConv)-1) @@ -750,7 +750,7 @@ tele_param_user_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset = 0; required_octs = len - used; if (*has_private_data == TRUE) { - dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, FALSE, &bit); + dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, OTHER, &bit); } if ((cd = g_iconv_open("UTF-8","iso-8859-1")) != (GIConv)-1) @@ -800,7 +800,7 @@ tele_param_user_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset = 0; bit = 0; if (*has_private_data == TRUE) { - dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, TRUE, &bit); + dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, GSM_7BITS, &bit); } out_len = gsm_sms_char_7bit_unpack(bit, required_octs, num_fields, @@ -826,7 +826,7 @@ tele_param_user_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset = 0; required_octs = len - used; if (*has_private_data == TRUE) { - dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, FALSE, &bit); + dis_field_udh(tvb_out, tree, &offset, &required_octs, &num_fields, OTHER, &bit); } if ((cd = g_iconv_open("UTF-8","EUC-KR")) != (GIConv)-1) 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) diff --git a/epan/dissectors/packet-gsm_sms.h b/epan/dissectors/packet-gsm_sms.h index 6836ac76f7..edb385a385 100644 --- a/epan/dissectors/packet-gsm_sms.h +++ b/epan/dissectors/packet-gsm_sms.h @@ -49,5 +49,11 @@ extern int gsm_sms_char_7bit_unpack(unsigned int offset, unsigned int in_length, extern gchar *gsm_sms_chars_to_utf8(const unsigned char* src, int len); +enum character_set { + OTHER, + GSM_7BITS, + ASCII_7BITS +}; + 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); |