aboutsummaryrefslogtreecommitdiffstats
path: root/epan
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
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')
-rw-r--r--epan/dissectors/packet-ansi_637.c14
-rw-r--r--epan/dissectors/packet-gsm_sms.c18
-rw-r--r--epan/dissectors/packet-gsm_sms.h8
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);