aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2015-09-01 19:39:44 +0200
committerPascal Quantin <pascal.quantin@gmail.com>2015-09-01 19:23:52 +0000
commitc8f87842cbb8853678d3f527fd42a72297cb773a (patch)
treec37e4f637f6dde62931b534118488de59576193c /epan
parentf0e4c49b6d0ad3000c00edcbe006e32393e33d6a (diff)
ANSI A: fix dissection of numerous fields broken in g7298a31
Change-Id: I09898cfc1aedc4b8067c6d12c94effc51a5ebbc0 Reviewed-on: https://code.wireshark.org/review/10345 Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-ansi_637.c54
-rw-r--r--epan/dissectors/packet-ansi_a.c14
2 files changed, 29 insertions, 39 deletions
diff --git a/epan/dissectors/packet-ansi_637.c b/epan/dissectors/packet-ansi_637.c
index b68bca95f2..7963b20bd1 100644
--- a/epan/dissectors/packet-ansi_637.c
+++ b/epan/dissectors/packet-ansi_637.c
@@ -1960,7 +1960,8 @@ trans_param_address(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gui
{
guint8 oct, oct2, odd;
gboolean email_addr;
- guint32 i, saved_offset, required_octs, num_fields;
+ guint32 i, saved_offset, required_octs;
+ guint64 num_fields;
SHORT_DATA_CHECK(len, 2);
@@ -1984,19 +1985,15 @@ trans_param_address(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gui
"%s (%u)",
val_to_str_const((oct & 0x38) >> 3, trans_param_addr_data_net_ton_strings, "Reserved"), (oct & 0x38) >> 3);
- offset += 1;
-
- oct2 = tvb_get_guint8(tvb, offset);
- num_fields = ((oct & 0x07) << 5) | ((oct2 & 0xf8) >> 3);
-
- proto_tree_add_bits_item(tree, hf_ansi_637_trans_addr_param_num_fields, tvb, (offset*8)+3, 8, ENC_BIG_ENDIAN);
+ proto_tree_add_bits_ret_val(tree, hf_ansi_637_trans_addr_param_num_fields, tvb, (offset*8)+5, 8, &num_fields, ENC_BIG_ENDIAN);
if (num_fields == 0) return;
+ offset += 1;
+ oct = tvb_get_guint8(tvb, offset);;
SHORT_DATA_CHECK(len - 2, num_fields);
proto_tree_add_bits_item(tree, hf_ansi_637_msb_first_field, tvb, offset*8, 3, ENC_NA);
offset += 1;
- oct = oct2;
i = 0;
while (i < num_fields)
@@ -2009,20 +2006,20 @@ trans_param_address(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gui
if (email_addr)
{
- proto_tree_add_string_format(tree, hf_ansi_637_trans_addr_param_number, tvb, offset - 1, num_fields + 1,
+ proto_tree_add_string_format(tree, hf_ansi_637_trans_addr_param_number, tvb, offset - 1, (gint)num_fields + 1,
ansi_637_bigbuf,
"Number: %s",
ansi_637_bigbuf);
}
else
{
- proto_tree_add_bytes(tree, hf_ansi_637_trans_bin_addr, tvb, offset - 1, num_fields + 1,
+ proto_tree_add_bytes(tree, hf_ansi_637_trans_bin_addr, tvb, offset - 1, (gint)num_fields + 1,
(guint8 *) ansi_637_bigbuf);
}
- offset += (num_fields - 1);
+ offset += ((guint32)num_fields - 1);
- proto_tree_add_bits_item(tree, hf_ansi_637_lsb_last_field, tvb, (offset*8)+3, 5, ENC_NA);
+ proto_tree_add_bits_item(tree, hf_ansi_637_lsb_last_field, tvb, offset*8, 5, ENC_NA);
proto_tree_add_item(tree, hf_ansi_637_reserved_bits_8_07, tvb, offset, 1, ENC_BIG_ENDIAN);
}
else
@@ -2036,22 +2033,19 @@ trans_param_address(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gui
"%s (%u)",
val_to_str_const((oct & 0x38) >> 3, ansi_a_ms_info_rec_num_type_vals, "Reserved"), (oct & 0x38) >> 3);
- oct2 = tvb_get_guint8(tvb, offset + 1);
-
proto_tree_add_item(tree, hf_ansi_637_trans_addr_param_plan, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
+ offset += 1;
- num_fields = tvb_get_ntohs(tvb, offset) & 0x07f8;
- proto_tree_add_bits_item(tree, hf_ansi_637_trans_addr_param_num_fields, tvb, (offset*8)+3, 8, ENC_BIG_ENDIAN);
+ proto_tree_add_bits_ret_val(tree, hf_ansi_637_trans_addr_param_num_fields, tvb, (offset*8)+1, 8, &num_fields, ENC_BIG_ENDIAN);
+ offset += 1;
if (num_fields == 0) return;
SHORT_DATA_CHECK(len - 3, num_fields);
- proto_tree_add_bits_item(tree, hf_ansi_637_msb_first_field, tvb, offset*8, 7, ENC_NA);
-
+ proto_tree_add_bits_item(tree, hf_ansi_637_msb_first_field, tvb, (offset*8)+1, 7, ENC_NA);
+ oct = tvb_get_guint8(tvb, offset);
offset += 1;
- oct = oct2;
i = 0;
while (i < num_fields)
@@ -2062,32 +2056,28 @@ trans_param_address(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gui
}
ansi_637_bigbuf[i] = '\0';
- proto_tree_add_string_format(tree, hf_ansi_637_trans_addr_param_number, tvb, offset - 1, num_fields + 1,
+ proto_tree_add_string_format(tree, hf_ansi_637_trans_addr_param_number, tvb, offset - 1, (gint)num_fields + 1,
ansi_637_bigbuf,
"Number: %s",
ansi_637_bigbuf);
- offset += (num_fields - 1);
+ offset += ((guint32)num_fields - 1);
- proto_tree_add_bits_item(tree, hf_ansi_637_lsb_last_field, tvb, (offset*8)+7, 1, ENC_NA);
+ proto_tree_add_bits_item(tree, hf_ansi_637_lsb_last_field, tvb, offset*8, 1, ENC_NA);
proto_tree_add_item(tree, hf_ansi_637_reserved_bits_8_7f, tvb, offset, 1, ENC_BIG_ENDIAN);
}
}
else
{
+ proto_tree_add_bits_ret_val(tree, hf_ansi_637_trans_addr_param_num_fields, tvb, (offset*8)+2, 8, &num_fields, ENC_BIG_ENDIAN);
offset += 1;
- oct2 = tvb_get_guint8(tvb, offset);
- num_fields = ((oct & 0x3f) << 2) | ((oct2 & 0xc0) >> 6);
-
- proto_tree_add_bits_item(tree, hf_ansi_637_trans_addr_param_num_fields, tvb, (offset*8)+6, 8, ENC_BIG_ENDIAN);
-
- oct = oct2;
+ oct = tvb_get_guint8(tvb, offset);
odd = FALSE;
if (num_fields > 0)
{
- i = (num_fields - 1) * 4;
+ i = ((guint32)num_fields - 1) * 4;
required_octs = (i / 8) + ((i % 8) ? 1 : 0);
SHORT_DATA_CHECK(len - 2, required_octs);
@@ -2160,7 +2150,7 @@ trans_param_subaddress(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
SHORT_DATA_CHECK(len - 2, num_fields);
- proto_tree_add_bits_item(tree, hf_ansi_637_msb_first_field, tvb, offset*8, 4, ENC_NA);
+ proto_tree_add_bits_item(tree, hf_ansi_637_msb_first_field, tvb, (offset*8)+12, 4, ENC_NA);
offset += 2;
oct = value & 0x000f;
@@ -2178,7 +2168,7 @@ trans_param_subaddress(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
offset += (num_fields - 1);
- proto_tree_add_bits_item(tree, hf_ansi_637_lsb_last_field, tvb, (offset*8)+4, 4, ENC_NA);
+ proto_tree_add_bits_item(tree, hf_ansi_637_lsb_last_field, tvb, offset*8, 4, ENC_NA);
proto_tree_add_item(tree, hf_ansi_637_reserved_bits_8_0f, tvb, offset, 1, ENC_BIG_ENDIAN);
}
diff --git a/epan/dissectors/packet-ansi_a.c b/epan/dissectors/packet-ansi_a.c
index 881fdd4e52..86083ddf10 100644
--- a/epan/dissectors/packet-ansi_a.c
+++ b/epan/dissectors/packet-ansi_a.c
@@ -4985,7 +4985,7 @@ elem_is2000_scr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32
bit_mask = 0x40;
}
- proto_tree_add_bits_item(scr_subtree, hf_ansi_a_dcch_cc_incl, tvb, (curr_offset*8)+bit_offset, 1, ENC_NA);
+ proto_tree_add_bits_item(scr_subtree, hf_ansi_a_dcch_cc_incl, tvb, (curr_offset*8)+(8-bit_offset), 1, ENC_NA);
if (oct & bit_mask)
{
/* can't be bothered to do the rest of the decode */
@@ -4999,7 +4999,7 @@ elem_is2000_scr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32
bit_mask >>= 1;
bit_offset--;
- proto_tree_add_bits_item(scr_subtree, hf_ansi_a_for_sch_cc_incl, tvb, (curr_offset*8)+bit_offset, 1, ENC_NA);
+ proto_tree_add_bits_item(scr_subtree, hf_ansi_a_for_sch_cc_incl, tvb, (curr_offset*8)+(8-bit_offset), 1, ENC_NA);
if (oct & bit_mask)
{
/* can't be bothered to do the rest of the decode */
@@ -5013,7 +5013,7 @@ elem_is2000_scr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32
bit_mask >>= 1;
bit_offset--;
- proto_tree_add_bits_item(scr_subtree, hf_ansi_a_rev_sch_cc_incl, tvb, (curr_offset*8)+bit_offset, 1, ENC_NA);
+ proto_tree_add_bits_item(scr_subtree, hf_ansi_a_rev_sch_cc_incl, tvb, (curr_offset*8)+(8-bit_offset), 1, ENC_NA);
if (oct & bit_mask)
{
@@ -5512,7 +5512,7 @@ elem_fwd_ms_info_recs(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, g
{
oct = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_bits_item(subtree, hf_ansi_a_msb_first_digit, tvb, curr_offset*8, 1, ENC_NA);
+ proto_tree_add_bits_item(subtree, hf_ansi_a_msb_first_digit, tvb, (curr_offset*8)+7, 1, ENC_NA);
curr_offset++;
@@ -5550,7 +5550,7 @@ elem_fwd_ms_info_recs(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, g
oct = (value & 0x00ff);
- proto_tree_add_bits_item(subtree, hf_ansi_a_msb_first_digit, tvb, curr_offset*8, 5, ENC_NA);
+ proto_tree_add_bits_item(subtree, hf_ansi_a_msb_first_digit, tvb, (curr_offset*8)+11, 5, ENC_NA);
curr_offset += 2;
@@ -5725,7 +5725,7 @@ elem_rev_ms_info_recs(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, g
{
oct = tvb_get_guint8(tvb, curr_offset);
- proto_tree_add_bits_item(subtree, hf_ansi_a_msb_first_digit, tvb, curr_offset*8, 1, ENC_NA);
+ proto_tree_add_bits_item(subtree, hf_ansi_a_msb_first_digit, tvb, (curr_offset*8)+7, 1, ENC_NA);
curr_offset++;
@@ -5764,7 +5764,7 @@ elem_rev_ms_info_recs(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, g
oct = (value & 0x00ff);
- proto_tree_add_bits_item(subtree, hf_ansi_a_msb_first_digit, tvb, curr_offset*8, 5, ENC_NA);
+ proto_tree_add_bits_item(subtree, hf_ansi_a_msb_first_digit, tvb, (curr_offset*8)+11, 5, ENC_NA);
curr_offset += 2;