Wireshark-dev: [Wireshark-dev] [PATCH 1/2] Exception handling in packet-mp2t.c (MPEG2 Transport
Each MPEG2 packet contains a number of TS packets. An exception
during processing of TS packets causes processing to stop of the
remaining TS packets.
The call to call_dissector() is very likely to throw a BoundsError
as this protocol splits the media stream up into chunks of
MP2T_PACKET_SIZE.
This patch, catches BoundsError and ReportedBoundsError, to allow
processing of the remaining TS packets.
Signed-off-by: Jesper Dangaard Brouer <hawk@xxxxxxx>
Reviewed-by: Martin Philip Topholm <mph@xxxxxxx>
---
epan/dissectors/packet-mp2t.c | 21 ++++++++++++++++++++-
1 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/epan/dissectors/packet-mp2t.c b/epan/dissectors/packet-mp2t.c
index f3b5420..149a23e 100644
--- a/epan/dissectors/packet-mp2t.c
+++ b/epan/dissectors/packet-mp2t.c
@@ -36,6 +36,7 @@
#include <string.h>
#include <epan/rtp_pt.h>
+#include "packet-frame.h"
/* The MPEG2 TS packet size */
#define MP2T_PACKET_SIZE 188
@@ -414,7 +415,25 @@ dissect_tsp( tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tree )
if (payload_len >=3 ) {
if (tvb_get_ntoh24(tvb, offset) == 0x000001) {
tvbuff_t *next_tvb = tvb_new_subset(tvb, offset, payload_len, payload_len);
- call_dissector(pes_handle, next_tvb, pinfo, mp2t_tree);
+ const char *saved_proto = pinfo->current_proto;
+
+ TRY {
+ call_dissector(pes_handle, next_tvb, pinfo, mp2t_tree);
+ }
+
+ /*
+ Don't stop processing TS packets if somebody threw
+ BoundsError, which means that dissecting the payload found
+ that the packet was cut off by before the end of the
+ payload. This is very likely as this protocol splits the
+ media stream up into chunks of MP2T_PACKET_SIZE.
+ */
+ CATCH2(BoundsError, ReportedBoundsError) {
+ show_exception(next_tvb, pinfo, tree, EXCEPT_CODE, GET_MESSAGE);
+ pinfo->current_proto = saved_proto;
+ }
+
+ ENDTRY;
} else {
proto_tree_add_item( mp2t_tree, hf_mp2t_payload, tvb, offset, payload_len, FALSE);
}