diff options
author | Uli Heilmeier <uh@heilmeier.eu> | 2016-11-15 00:14:51 +0100 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2016-11-20 12:39:56 +0000 |
commit | c63609b360cf8fa3a9f86d4dcdaaada2d2be87f8 (patch) | |
tree | 3b5d01f82a8fe5e062221c881b2ef11f3b9bdc7d /epan | |
parent | 7ecbad89a91a2e978da97489484bbbbced55dd15 (diff) |
DICOM: Fix handling of AT tag elements
A Attribute Identifier List can have more than one AT element. Therefore
we have to loop through the elements list.
Bug: 13077
Change-Id: I3adaa5ba50a1ad01e7c5bacd05118c65afcf4442
Reviewed-on: https://code.wireshark.org/review/18825
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-dcm.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/epan/dissectors/packet-dcm.c b/epan/dissectors/packet-dcm.c index fa7bd2cf59..4ecf297aa9 100644 --- a/epan/dissectors/packet-dcm.c +++ b/epan/dissectors/packet-dcm.c @@ -5821,17 +5821,24 @@ dissect_dcm_tag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, dcm_s guint16 at_grp; guint16 at_elm; + guint32 at_offset = 0; + gchar *at_value = ""; - if (is_little_endian) at_grp = tvb_get_letohs(tvb, offset); - else at_grp = tvb_get_ntohs(tvb, offset); + while(at_offset < vl_max-3) { + if (is_little_endian) at_grp = tvb_get_letohs(tvb, offset+at_offset); + else at_grp = tvb_get_ntohs(tvb, offset+at_offset); - if (is_little_endian) at_elm = tvb_get_letohs(tvb, offset); - else at_elm = tvb_get_ntohs(tvb, offset); + if (is_little_endian) at_elm = tvb_get_letohs(tvb, offset+at_offset+2); + else at_elm = tvb_get_ntohs(tvb, offset+at_offset+2); - proto_tree_add_uint_format(tree, hf_dcm_tag_value_32u, tvb, offset, 4, - (at_grp << 16) | at_elm, "%-8.8s%04x,%04x", "Value:", at_grp, at_elm); + proto_tree_add_uint_format(tree, hf_dcm_tag_value_32u, tvb, offset+at_offset, 4, + (at_grp << 16) | at_elm, "%-8.8s%04x,%04x", "Value:", at_grp, at_elm); + + at_value = wmem_strdup_printf(wmem_packet_scope(),"%s(%04x,%04x)", at_value, at_grp, at_elm); - g_snprintf(*tag_value, MAX_BUF_LEN, "(%04x,%04x)", at_grp, at_elm); + at_offset += 4; + } + g_snprintf(*tag_value, MAX_BUF_LEN, "%s", at_value); } else if (strncmp(vr, "FL", 2) == 0) { /* Single Float */ |