summaryrefslogtreecommitdiff
path: root/epan/dissectors/packet-dcm.c
diff options
context:
space:
mode:
authorUli Heilmeier <uh@heilmeier.eu>2016-11-15 00:14:51 +0100
committerMichael Mann <mmann78@netscape.net>2016-11-20 12:39:56 +0000
commitc63609b360cf8fa3a9f86d4dcdaaada2d2be87f8 (patch)
tree3b5d01f82a8fe5e062221c881b2ef11f3b9bdc7d /epan/dissectors/packet-dcm.c
parent7ecbad89a91a2e978da97489484bbbbced55dd15 (diff)
downloadwireshark-c63609b360cf8fa3a9f86d4dcdaaada2d2be87f8.tar.gz
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/dissectors/packet-dcm.c')
-rw-r--r--epan/dissectors/packet-dcm.c21
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 */