aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-jpeg.c
diff options
context:
space:
mode:
authorjake <jake@f5534014-38df-0310-8fa8-9805f1628bb7>2008-02-02 16:41:12 +0000
committerjake <jake@f5534014-38df-0310-8fa8-9805f1628bb7>2008-02-02 16:41:12 +0000
commit8b3a8924370660e784d7f29807f8e310283cdf7e (patch)
treea071df27378d7cac7dfb5a735fa5b100bca82082 /epan/dissectors/packet-jpeg.c
parentc99e3586b1ebdd7cf4cbfca86e24d0bbc20ad58d (diff)
From Peter Kjellerstedt:
I was capturing an RTP stream the other day which contained JPEG images streamed according to RFC 2435. However, Wireshark reported them as malformed. After some debugging of the Wireshark code it turned out that the decoding of JPEG images which contain a quantization table was incorrect. I have attached a patch to correct the decoding. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@24246 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-jpeg.c')
-rw-r--r--epan/dissectors/packet-jpeg.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/epan/dissectors/packet-jpeg.c b/epan/dissectors/packet-jpeg.c
index 4b3f2e4dab..5ac9e263b1 100644
--- a/epan/dissectors/packet-jpeg.c
+++ b/epan/dissectors/packet-jpeg.c
@@ -77,6 +77,7 @@ dissect_jpeg( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
proto_tree *main_hdr_tree = NULL;
proto_tree *restart_hdr_tree = NULL;
proto_tree *qtable_hdr_tree = NULL;
+ guint32 fragment_offset = 0;
guint16 len = 0;
guint8 type = 0;
guint8 q = 0;
@@ -103,6 +104,7 @@ dissect_jpeg( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
proto_tree_add_item(main_hdr_tree, hf_rtp_jpeg_main_hdr_ts, tvb, offset, 1, FALSE);
offset += 1;
proto_tree_add_item(main_hdr_tree, hf_rtp_jpeg_main_hdr_offs, tvb, offset, 3, FALSE);
+ fragment_offset = tvb_get_ntoh24(tvb, offset);
offset += 3;
proto_tree_add_item(main_hdr_tree, hf_rtp_jpeg_main_hdr_type, tvb, offset, 1, FALSE);
type = tvb_get_guint8(tvb, offset);
@@ -128,19 +130,19 @@ dissect_jpeg( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
offset += 2;
}
- if (q >= 128) {
+ if (q >= 128 && fragment_offset == 0) {
ti = proto_tree_add_item(jpeg_tree, hf_rtp_jpeg_qtable_hdr, tvb, offset, -1, FALSE);
qtable_hdr_tree = proto_item_add_subtree(ti, ett_jpeg);
- proto_tree_add_item(main_hdr_tree, hf_rtp_jpeg_qtable_hdr_mbz, tvb, offset, 1, FALSE);
+ proto_tree_add_item(qtable_hdr_tree, hf_rtp_jpeg_qtable_hdr_mbz, tvb, offset, 1, FALSE);
offset += 1;
- proto_tree_add_item(main_hdr_tree, hf_rtp_jpeg_qtable_hdr_prec, tvb, offset, 1, FALSE);
+ proto_tree_add_item(qtable_hdr_tree, hf_rtp_jpeg_qtable_hdr_prec, tvb, offset, 1, FALSE);
offset += 1;
- proto_tree_add_item(main_hdr_tree, hf_rtp_jpeg_qtable_hdr_length, tvb, offset, 2, FALSE);
- len = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(qtable_hdr_tree, hf_rtp_jpeg_qtable_hdr_length, tvb, offset, 2, FALSE);
+ len = tvb_get_ntohs(tvb, offset);
offset += 2;
if (len > 0) {
- proto_tree_add_item(main_hdr_tree, hf_rtp_jpeg_qtable_hdr_data, tvb, offset, len, FALSE);
- offset += 1;
+ proto_tree_add_item(qtable_hdr_tree, hf_rtp_jpeg_qtable_hdr_data, tvb, offset, len, FALSE);
+ offset += len;
}
proto_item_set_len(ti, len + 4);
}