OSITP: Pass ED-TPDU to subdissectors

Fix #7393
This commit is contained in:
John Thacker 2024-02-22 09:49:55 -05:00
parent ff23d579de
commit 00c938b7a9
1 changed files with 26 additions and 5 deletions

View File

@ -1179,7 +1179,9 @@ static int ositp_decode_DT(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
} /* ositp_decode_DT */
static int ositp_decode_ED(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
packet_info *pinfo, proto_tree *tree)
packet_info *pinfo, proto_tree *tree,
gboolean uses_inactive_subset,
gboolean *subdissector_found)
{
proto_tree *cotp_tree = NULL;
proto_item *ti;
@ -1188,6 +1190,7 @@ static int ositp_decode_ED(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
guint tpdu_nr;
tvbuff_t *next_tvb;
guint tpdu_len;
heur_dtbl_entry_t *hdtbl_entry;
/* ED TPDUs have user data, so they run to the end of the containing PDU */
tpdu_len = tvb_reported_length_remaining(tvb, offset);
@ -1367,11 +1370,28 @@ static int ositp_decode_ED(tvbuff_t *tvb, int offset, guint8 li, guint8 tpdu,
offset += li;
/*
* XXX - hand this to subdissectors but tell them that this is
* in an ED packet?
* Tell subdissectors that this is in an ED packet?
*/
next_tvb = tvb_new_subset_remaining(tvb, offset);
call_data_dissector(next_tvb, pinfo, tree);
if (uses_inactive_subset) {
if (dissector_try_heuristic(cotp_is_heur_subdissector_list, next_tvb,
pinfo, tree, &hdtbl_entry, NULL)) {
*subdissector_found = TRUE;
} else {
/* Fill in other Dissectors using inactive subset here */
call_data_dissector(next_tvb, pinfo, tree);
}
} else {
/*
* ED TPDUs are never fragmented
*/
if (dissector_try_heuristic(cotp_heur_subdissector_list, next_tvb, pinfo,
tree, &hdtbl_entry, NULL)) {
*subdissector_found = TRUE;
} else {
call_data_dissector(next_tvb, pinfo, tree);
}
}
offset += tvb_captured_length_remaining(tvb, offset);
/* we dissected all of the containing PDU */
@ -2112,7 +2132,8 @@ static gint dissect_ositp_internal(tvbuff_t *tvb, packet_info *pinfo,
uses_inactive_subset, &subdissector_found);
break;
case ED_TPDU :
new_offset = ositp_decode_ED(tvb, offset, li, tpdu, pinfo, tree);
new_offset = ositp_decode_ED(tvb, offset, li, tpdu, pinfo, tree,
uses_inactive_subset, &subdissector_found);
break;
case RJ_TPDU :
new_offset = ositp_decode_RJ(tvb, offset, li, tpdu, cdt, pinfo, tree);