diff options
author | Michael Mann <mmann78@netscape.net> | 2016-05-29 15:38:57 -0400 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2016-05-30 04:11:18 +0000 |
commit | da55e2c4dd0e3a1f6deb01c8b2fbf1f1a6e16277 (patch) | |
tree | 0cf621739b093952347b5a90825dc02baa666506 /epan/dissectors | |
parent | 734bcd3e00a109a2970b09ba67e43dca9e4e8824 (diff) |
Remove the last usage of proto_item_append_string
Change-Id: Id365931569bb3e8419023f30e788259939dea386
Reviewed-on: https://code.wireshark.org/review/15609
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-isup.c | 73 |
1 files changed, 30 insertions, 43 deletions
diff --git a/epan/dissectors/packet-isup.c b/epan/dissectors/packet-isup.c index 10795152e4..bab3ef681f 100644 --- a/epan/dissectors/packet-isup.c +++ b/epan/dissectors/packet-isup.c @@ -3349,16 +3349,13 @@ dissect_isup_digits_common(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_, p const char *param_name, gint hf_number, gint hf_odd_digit, gint hf_even_digit, gboolean even_indicator, e164_number_type_t number_type, guint nature_of_address) { - gint i = 0; gint length; proto_item *digits_item; proto_tree *digits_tree; guint8 digit_pair = 0; wmem_strbuf_t *strbuf_number; - char *number; e164_info_t e164_info; - gboolean old_visible; - gboolean set_visibility = FALSE; + gint start_offset = offset; length = tvb_reported_length_remaining(tvb, offset); if (length == 0) { @@ -3367,37 +3364,14 @@ dissect_isup_digits_common(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_, p return NULL; } - strbuf_number = wmem_strbuf_sized_new(wmem_packet_scope(), MAXDIGITS+1, 0); - - /* We are going to be using proto_item_append_string() on hf_number so we - * must disable the TRY_TO_FAKE_THIS_ITEM() optimisation for the tree by - * setting it as visible. See proto.h for details. - */ - if(proto_field_is_referenced(tree, hf_number)) { - old_visible = proto_tree_set_visible(tree, TRUE); - set_visibility = TRUE; - } - digits_item = proto_tree_add_string(tree, hf_number, tvb, offset, -1, ""); - digits_tree = proto_item_add_subtree(digits_item, ett_isup_address_digits); - if(set_visibility) { - proto_tree_set_visible(tree, old_visible); - } + strbuf_number = wmem_strbuf_new(wmem_packet_scope(), ""); + /* Make the digit string */ while (length > 0) { - if (++i > MAXDIGITS) { - expert_add_info(pinfo, digits_item, &ei_isup_too_many_digits); - break; - } digit_pair = tvb_get_guint8(tvb, offset); - proto_tree_add_uint(digits_tree, hf_odd_digit, tvb, offset, 1, digit_pair); wmem_strbuf_append_c(strbuf_number, number_to_char(digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK)); if ((length - 1) > 0) { - if (++i > MAXDIGITS) { - expert_add_info(pinfo, digits_item, &ei_isup_too_many_digits); - break; - } - proto_tree_add_uint(digits_tree, hf_even_digit, tvb, offset, 1, digit_pair); wmem_strbuf_append_c(strbuf_number, number_to_char((digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10)); } @@ -3406,32 +3380,45 @@ dissect_isup_digits_common(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_, p } if (even_indicator && (tvb_reported_length(tvb) > 0)) { - if (++i < MAXDIGITS) { - /* Even Indicator set -> last (even) digit is valid and has be displayed */ - proto_tree_add_uint(digits_tree, hf_isup_calling_party_even_address_signal_digit, - tvb, offset - 1, 1, digit_pair); - wmem_strbuf_append_c(strbuf_number, number_to_char((digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10)); - } else { - expert_add_info(pinfo, digits_item, &ei_isup_too_many_digits); + wmem_strbuf_append_c(strbuf_number, number_to_char((digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10)); + } + + /* Now make the tree */ + offset = start_offset; + digits_item = proto_tree_add_string(tree, hf_number, tvb, offset, -1, wmem_strbuf_get_str(strbuf_number)); + digits_tree = proto_item_add_subtree(digits_item, ett_isup_address_digits); + + while (length > 0) { + proto_tree_add_item(digits_tree, hf_odd_digit, tvb, offset, 1, ENC_NA); + + if ((length - 1) > 0) { + proto_tree_add_item(digits_tree, hf_even_digit, tvb, offset, 1, ENC_NA); } + + offset += 1; + length = tvb_reported_length_remaining(tvb, offset); } - number = wmem_strbuf_finalize(strbuf_number); + if (even_indicator && (tvb_reported_length(tvb) > 0)) { + /* Even Indicator set -> last (even) digit is valid and has be displayed */ + proto_tree_add_item(digits_tree, hf_isup_calling_party_even_address_signal_digit, + tvb, offset - 1, 1, ENC_NA); + } - /* Now that we have all the digits decoded, add them to the parameter field */ - proto_item_append_string(digits_item, number); + if (wmem_strbuf_get_len(strbuf_number) > MAXDIGITS) + expert_add_info(pinfo, digits_item, &ei_isup_too_many_digits); if (number_type != NONE) { e164_info.e164_number_type = number_type; e164_info.nature_of_address = nature_of_address; - e164_info.E164_number_str = number; - e164_info.E164_number_length = i - 1; + e164_info.E164_number_str = wmem_strbuf_get_str(strbuf_number); + e164_info.E164_number_length = wmem_strbuf_get_len(strbuf_number) - 1; dissect_e164_number(tvb, digits_tree, 2, (offset - 2), e164_info); } - proto_item_set_text(item, "%s: %s", param_name, number); + proto_item_set_text(item, "%s: %s", param_name, wmem_strbuf_get_str(strbuf_number)); - return number; + return wmem_strbuf_finalize(strbuf_number); } /* ------------------------------------------------------------------ |