From 5e949867190ab33b36797a2c8a58a7af6f0476af Mon Sep 17 00:00:00 2001 From: Gerald Combs Date: Sun, 31 Dec 2023 15:06:40 -0800 Subject: [PATCH] asn2wrs: Add recursion checks Origin: https://gitlab.com/wireshark/wireshark/-/merge_requests/13869 Add a recursion depth check whenever we have cyclic dependencies. Regenerate our dissectors. Fixes #19501 (cherry picked from commit 8f797db63ca44875a07d0d8a5d298a79d09b44ec) Conflicts: epan/dissectors/asn1/x509sat/packet-x509sat-template.c epan/dissectors/packet-cmip.c epan/dissectors/packet-cmp.c epan/dissectors/packet-dap.c epan/dissectors/packet-disp.c epan/dissectors/packet-e2ap.c epan/dissectors/packet-glow.c epan/dissectors/packet-goose.c epan/dissectors/packet-h225.c epan/dissectors/packet-h245.c epan/dissectors/packet-h248.c epan/dissectors/packet-ieee1609dot2.c epan/dissectors/packet-ldap.c epan/dissectors/packet-mms.c epan/dissectors/packet-p22.c epan/dissectors/packet-p7.c epan/dissectors/packet-x509if.c epan/dissectors/packet-x509sat.c epan/dissectors/packet-z3950.c --- .../asn1/cmip/packet-cmip-template.c | 1 + .../dissectors/asn1/cmp/packet-cmp-template.c | 1 + .../dissectors/asn1/dap/packet-dap-template.c | 1 + .../asn1/disp/packet-disp-template.c | 1 + .../asn1/glow/packet-glow-template.c | 1 + .../asn1/goose/packet-goose-template.c | 1 + .../asn1/h245/packet-h245-template.c | 1 + .../asn1/h248/packet-h248-template.c | 1 + .../asn1/ldap/packet-ldap-template.c | 1 + .../dissectors/asn1/p22/packet-p22-template.c | 1 + epan/dissectors/asn1/p7/packet-p7-template.c | 1 + .../asn1/x509if/packet-x509if-template.c | 1 + .../asn1/x509sat/packet-x509sat-template.c | 1 + epan/dissectors/packet-cmip.c | 24 +++++--- epan/dissectors/packet-cmp.c | 20 +++++-- epan/dissectors/packet-dap.c | 44 ++++++++++++--- epan/dissectors/packet-disp.c | 26 +++++++-- epan/dissectors/packet-glow.c | 30 ++++++++-- epan/dissectors/packet-goose.c | 18 ++++-- epan/dissectors/packet-h225.c | 13 +++++ epan/dissectors/packet-h245.c | 56 +++++++++++++++++-- epan/dissectors/packet-h248.c | 18 ++++-- epan/dissectors/packet-ieee1609dot2.c | 7 +++ epan/dissectors/packet-its.c | 17 ++++-- epan/dissectors/packet-ldap.c | 20 +++++-- epan/dissectors/packet-mms.c | 25 +++++++++ epan/dissectors/packet-p22.c | 40 ++++++++++--- epan/dissectors/packet-p7.c | 28 ++++++---- epan/dissectors/packet-sv.c | 10 ++-- epan/dissectors/packet-x509if.c | 32 +++++++++-- epan/dissectors/packet-x509sat.c | 22 +++++--- epan/dissectors/packet-z3950.c | 19 +++++++ tools/asn2wrs.py | 36 ++++++++++++ 33 files changed, 422 insertions(+), 96 deletions(-) diff --git a/epan/dissectors/asn1/cmip/packet-cmip-template.c b/epan/dissectors/asn1/cmip/packet-cmip-template.c index dbac6c6b546..53caeb034eb 100644 --- a/epan/dissectors/asn1/cmip/packet-cmip-template.c +++ b/epan/dissectors/asn1/cmip/packet-cmip-template.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" diff --git a/epan/dissectors/asn1/cmp/packet-cmp-template.c b/epan/dissectors/asn1/cmp/packet-cmp-template.c index 21e3b27ed44..d9c02452260 100644 --- a/epan/dissectors/asn1/cmp/packet-cmp-template.c +++ b/epan/dissectors/asn1/cmp/packet-cmp-template.c @@ -18,6 +18,7 @@ #include #include +#include #include "packet-ber.h" #include "packet-cmp.h" #include "packet-crmf.h" diff --git a/epan/dissectors/asn1/dap/packet-dap-template.c b/epan/dissectors/asn1/dap/packet-dap-template.c index c5884becd66..8c14a03ba36 100644 --- a/epan/dissectors/asn1/dap/packet-dap-template.c +++ b/epan/dissectors/asn1/dap/packet-dap-template.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" diff --git a/epan/dissectors/asn1/disp/packet-disp-template.c b/epan/dissectors/asn1/disp/packet-disp-template.c index a28aa4e8e3d..b76959de22a 100644 --- a/epan/dissectors/asn1/disp/packet-disp-template.c +++ b/epan/dissectors/asn1/disp/packet-disp-template.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" diff --git a/epan/dissectors/asn1/glow/packet-glow-template.c b/epan/dissectors/asn1/glow/packet-glow-template.c index af6f16fb209..088d3c53332 100644 --- a/epan/dissectors/asn1/glow/packet-glow-template.c +++ b/epan/dissectors/asn1/glow/packet-glow-template.c @@ -13,6 +13,7 @@ # include "config.h" #include +#include #include "packet-ber.h" #define PNAME "Glow" diff --git a/epan/dissectors/asn1/goose/packet-goose-template.c b/epan/dissectors/asn1/goose/packet-goose-template.c index 142a272ee02..9a78db4c256 100644 --- a/epan/dissectors/asn1/goose/packet-goose-template.c +++ b/epan/dissectors/asn1/goose/packet-goose-template.c @@ -16,6 +16,7 @@ #include #include +#include #include #include diff --git a/epan/dissectors/asn1/h245/packet-h245-template.c b/epan/dissectors/asn1/h245/packet-h245-template.c index b71edc7288d..1ee778cf9a0 100644 --- a/epan/dissectors/asn1/h245/packet-h245-template.c +++ b/epan/dissectors/asn1/h245/packet-h245-template.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include "packet-tpkt.h" diff --git a/epan/dissectors/asn1/h248/packet-h248-template.c b/epan/dissectors/asn1/h248/packet-h248-template.c index af1a2ba83cc..514c899396d 100644 --- a/epan/dissectors/asn1/h248/packet-h248-template.c +++ b/epan/dissectors/asn1/h248/packet-h248-template.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/epan/dissectors/asn1/ldap/packet-ldap-template.c b/epan/dissectors/asn1/ldap/packet-ldap-template.c index b9313819996..0021c5641e0 100644 --- a/epan/dissectors/asn1/ldap/packet-ldap-template.c +++ b/epan/dissectors/asn1/ldap/packet-ldap-template.c @@ -80,6 +80,7 @@ #include #include #include +#include #include #include #include diff --git a/epan/dissectors/asn1/p22/packet-p22-template.c b/epan/dissectors/asn1/p22/packet-p22-template.c index f0cf69afbda..fe7d4d2ddee 100644 --- a/epan/dissectors/asn1/p22/packet-p22-template.c +++ b/epan/dissectors/asn1/p22/packet-p22-template.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" diff --git a/epan/dissectors/asn1/p7/packet-p7-template.c b/epan/dissectors/asn1/p7/packet-p7-template.c index 4df623bac03..621aa9b0392 100644 --- a/epan/dissectors/asn1/p7/packet-p7-template.c +++ b/epan/dissectors/asn1/p7/packet-p7-template.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" diff --git a/epan/dissectors/asn1/x509if/packet-x509if-template.c b/epan/dissectors/asn1/x509if/packet-x509if-template.c index cc75f93a7bc..10de0ec8eb3 100644 --- a/epan/dissectors/asn1/x509if/packet-x509if-template.c +++ b/epan/dissectors/asn1/x509if/packet-x509if-template.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "packet-ber.h" diff --git a/epan/dissectors/asn1/x509sat/packet-x509sat-template.c b/epan/dissectors/asn1/x509sat/packet-x509sat-template.c index 1166e33ba48..d2640228a5c 100644 --- a/epan/dissectors/asn1/x509sat/packet-x509sat-template.c +++ b/epan/dissectors/asn1/x509sat/packet-x509sat-template.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-p1.h" diff --git a/epan/dissectors/packet-cmip.c b/epan/dissectors/packet-cmip.c index 56277dc8404..eeb8deeb027 100644 --- a/epan/dissectors/packet-cmip.c +++ b/epan/dissectors/packet-cmip.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" @@ -328,7 +329,7 @@ static int hf_cmip_T_daysOfWeek_friday = -1; static int hf_cmip_T_daysOfWeek_saturday = -1; /*--- End of included file: packet-cmip-hf.c ---*/ -#line 43 "./asn1/cmip/packet-cmip-template.c" +#line 44 "./asn1/cmip/packet-cmip-template.c" /* Initialize the subtree pointers */ static gint ett_cmip = -1; @@ -458,7 +459,7 @@ static gint ett_cmip_T_modificationList = -1; static gint ett_cmip_T_modificationList_item = -1; /*--- End of included file: packet-cmip-ett.c ---*/ -#line 47 "./asn1/cmip/packet-cmip-template.c" +#line 48 "./asn1/cmip/packet-cmip-template.c" static expert_field ei_wrong_spdu_type = EI_INIT; @@ -521,7 +522,7 @@ static const value_string cmip_error_code_vals[] = { /*--- End of included file: packet-cmip-table.c ---*/ -#line 58 "./asn1/cmip/packet-cmip-template.c" +#line 59 "./asn1/cmip/packet-cmip-template.c" static int opcode_type; #define OPCODE_INVOKE 1 @@ -620,7 +621,7 @@ static const char *object_identifier_id; #define noInvokeId NULL /*--- End of included file: packet-cmip-val.h ---*/ -#line 68 "./asn1/cmip/packet-cmip-template.c" +#line 69 "./asn1/cmip/packet-cmip-template.c" /*--- Included file: packet-cmip-fn.c ---*/ #line 1 "./asn1/cmip/packet-cmip-fn.c" @@ -631,6 +632,7 @@ static const char *object_identifier_id; static int dissect_cmip_CMISFilter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -1050,10 +1052,16 @@ static const ber_choice_t CMISFilter_choice[] = { static int dissect_cmip_CMISFilter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, CMISFilter_choice, hf_index, ett_cmip_CMISFilter, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -4454,7 +4462,7 @@ static int dissect_WeekMask_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto /*--- End of included file: packet-cmip-fn.c ---*/ -#line 69 "./asn1/cmip/packet-cmip-template.c" +#line 70 "./asn1/cmip/packet-cmip-template.c" @@ -5635,7 +5643,7 @@ void proto_register_cmip(void) { NULL, HFILL }}, /*--- End of included file: packet-cmip-hfarr.c ---*/ -#line 145 "./asn1/cmip/packet-cmip-template.c" +#line 146 "./asn1/cmip/packet-cmip-template.c" }; /* List of subtrees */ @@ -5767,7 +5775,7 @@ void proto_register_cmip(void) { &ett_cmip_T_modificationList_item, /*--- End of included file: packet-cmip-ettarr.c ---*/ -#line 151 "./asn1/cmip/packet-cmip-template.c" +#line 152 "./asn1/cmip/packet-cmip-template.c" }; static ei_register_info ei[] = { @@ -5862,7 +5870,7 @@ void proto_register_cmip(void) { /*--- End of included file: packet-cmip-dis-tab.c ---*/ -#line 170 "./asn1/cmip/packet-cmip-template.c" +#line 171 "./asn1/cmip/packet-cmip-template.c" oid_add_from_string("discriminatorId(1)","2.9.3.2.7.1"); attribute_id_dissector_table = register_dissector_table("cmip.attribute_id", "CMIP Attribute Id", proto_cmip, FT_UINT32, BASE_DEC); diff --git a/epan/dissectors/packet-cmp.c b/epan/dissectors/packet-cmp.c index 6f6febdaf51..f6b3ac3fb18 100644 --- a/epan/dissectors/packet-cmp.c +++ b/epan/dissectors/packet-cmp.c @@ -26,6 +26,7 @@ #include #include +#include #include "packet-ber.h" #include "packet-cmp.h" #include "packet-crmf.h" @@ -224,7 +225,7 @@ static int hf_cmp_PKIFailureInfo_systemFailure = -1; static int hf_cmp_PKIFailureInfo_duplicateCertReq = -1; /*--- End of included file: packet-cmp-hf.c ---*/ -#line 56 "./asn1/cmp/packet-cmp-template.c" +#line 57 "./asn1/cmp/packet-cmp-template.c" /* Initialize the subtree pointers */ static gint ett_cmp = -1; @@ -280,7 +281,7 @@ static gint ett_cmp_PollRepContent = -1; static gint ett_cmp_PollRepContent_item = -1; /*--- End of included file: packet-cmp-ett.c ---*/ -#line 60 "./asn1/cmp/packet-cmp-template.c" +#line 61 "./asn1/cmp/packet-cmp-template.c" /*--- Included file: packet-cmp-fn.c ---*/ #line 1 "./asn1/cmp/packet-cmp-fn.c" @@ -290,6 +291,7 @@ static gint ett_cmp_PollRepContent_item = -1; /*int dissect_cmp_PKIMessage(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);*/ +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static const value_string cmp_CMPCertificate_vals[] = { { 0, "x509v3PKCert" }, @@ -1106,9 +1108,15 @@ static const ber_sequence_t PKIMessage_sequence[] = { int dissect_cmp_PKIMessage(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 5; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset, PKIMessage_sequence, hf_index, ett_cmp_PKIMessage); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1463,7 +1471,7 @@ static int dissect_SuppLangTagsValue_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _ /*--- End of included file: packet-cmp-fn.c ---*/ -#line 61 "./asn1/cmp/packet-cmp-template.c" +#line 62 "./asn1/cmp/packet-cmp-template.c" static int dissect_cmp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) @@ -2342,7 +2350,7 @@ void proto_register_cmp(void) { NULL, HFILL }}, /*--- End of included file: packet-cmp-hfarr.c ---*/ -#line 303 "./asn1/cmp/packet-cmp-template.c" +#line 304 "./asn1/cmp/packet-cmp-template.c" }; /* List of subtrees */ @@ -2400,7 +2408,7 @@ void proto_register_cmp(void) { &ett_cmp_PollRepContent_item, /*--- End of included file: packet-cmp-ettarr.c ---*/ -#line 309 "./asn1/cmp/packet-cmp-template.c" +#line 310 "./asn1/cmp/packet-cmp-template.c" }; module_t *cmp_module; @@ -2487,7 +2495,7 @@ void proto_reg_handoff_cmp(void) { /*--- End of included file: packet-cmp-dis-tab.c ---*/ -#line 374 "./asn1/cmp/packet-cmp-template.c" +#line 375 "./asn1/cmp/packet-cmp-template.c" inited = TRUE; } diff --git a/epan/dissectors/packet-dap.c b/epan/dissectors/packet-dap.c index af21d0f31d3..e2e2ec8c81c 100644 --- a/epan/dissectors/packet-dap.c +++ b/epan/dissectors/packet-dap.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" @@ -463,7 +464,7 @@ static int hf_dap_SearchControlOptions_separateFamilyMembers = -1; static int hf_dap_SearchControlOptions_searchFamily = -1; /*--- End of included file: packet-dap-hf.c ---*/ -#line 49 "./asn1/dap/packet-dap-template.c" +#line 50 "./asn1/dap/packet-dap-template.c" /* Initialize the subtree pointers */ static gint ett_dap = -1; @@ -642,7 +643,7 @@ static gint ett_dap_UpdateError = -1; static gint ett_dap_T_signedUpdateError = -1; /*--- End of included file: packet-dap-ett.c ---*/ -#line 53 "./asn1/dap/packet-dap-template.c" +#line 54 "./asn1/dap/packet-dap-template.c" static expert_field ei_dap_anonymous = EI_INIT; @@ -669,7 +670,7 @@ static expert_field ei_dap_anonymous = EI_INIT; #define id_errcode_dsaReferral 9 /*--- End of included file: packet-dap-val.h ---*/ -#line 57 "./asn1/dap/packet-dap-template.c" +#line 58 "./asn1/dap/packet-dap-template.c" /*--- Included file: packet-dap-table.c ---*/ @@ -707,7 +708,7 @@ static const value_string dap_err_code_string_vals[] = { /*--- End of included file: packet-dap-table.c ---*/ -#line 59 "./asn1/dap/packet-dap-template.c" +#line 60 "./asn1/dap/packet-dap-template.c" /*--- Included file: packet-dap-fn.c ---*/ @@ -730,6 +731,7 @@ static int dissect_dap_ListResultData(gboolean implicit_tag _U_, tvbuff_t *tvb _ static int dissect_dap_SearchResultData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. const value_string dap_FamilyGrouping_vals[] = { { 1, "entryOnly" }, @@ -1294,9 +1296,15 @@ static const ber_sequence_t FamilyEntries_sequence[] = { static int dissect_dap_FamilyEntries(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 5; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset, FamilyEntries_sequence, hf_index, ett_dap_FamilyEntries); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1492,10 +1500,16 @@ static const ber_choice_t Filter_choice[] = { int dissect_dap_Filter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, Filter_choice, hf_index, ett_dap_Filter, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -2948,10 +2962,16 @@ static const ber_choice_t ListResultData_choice[] = { static int dissect_dap_ListResultData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, ListResultData_choice, hf_index, ett_dap_ListResultData, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -3333,10 +3353,16 @@ static const ber_choice_t SearchResultData_choice[] = { static int dissect_dap_SearchResultData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, SearchResultData_choice, hf_index, ett_dap_SearchResultData, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -4754,7 +4780,7 @@ static int dissect_UpdateError_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, pr /*--- End of included file: packet-dap-fn.c ---*/ -#line 61 "./asn1/dap/packet-dap-template.c" +#line 62 "./asn1/dap/packet-dap-template.c" /*--- Included file: packet-dap-table11.c ---*/ @@ -4786,7 +4812,7 @@ static const ros_opr_t dap_opr_tab[] = { /*--- End of included file: packet-dap-table11.c ---*/ -#line 63 "./asn1/dap/packet-dap-template.c" +#line 64 "./asn1/dap/packet-dap-template.c" /*--- Included file: packet-dap-table21.c ---*/ #line 1 "./asn1/dap/packet-dap-table21.c" @@ -4815,7 +4841,7 @@ static const ros_err_t dap_err_tab[] = { /*--- End of included file: packet-dap-table21.c ---*/ -#line 64 "./asn1/dap/packet-dap-template.c" +#line 65 "./asn1/dap/packet-dap-template.c" static const ros_info_t dap_ros_info = { "DAP", @@ -6455,7 +6481,7 @@ void proto_register_dap(void) { NULL, HFILL }}, /*--- End of included file: packet-dap-hfarr.c ---*/ -#line 83 "./asn1/dap/packet-dap-template.c" +#line 84 "./asn1/dap/packet-dap-template.c" }; /* List of subtrees */ @@ -6636,7 +6662,7 @@ void proto_register_dap(void) { &ett_dap_T_signedUpdateError, /*--- End of included file: packet-dap-ettarr.c ---*/ -#line 89 "./asn1/dap/packet-dap-template.c" +#line 90 "./asn1/dap/packet-dap-template.c" }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-disp.c b/epan/dissectors/packet-disp.c index 31ace80695f..e3c52719db6 100644 --- a/epan/dissectors/packet-disp.c +++ b/epan/dissectors/packet-disp.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" @@ -165,7 +166,7 @@ static int hf_disp_signedShadowError = -1; /* T_signedShadowError */ static int hf_disp_shadowError = -1; /* ShadowErrorData */ /*--- End of included file: packet-disp-hf.c ---*/ -#line 49 "./asn1/disp/packet-disp-template.c" +#line 50 "./asn1/disp/packet-disp-template.c" /* Initialize the subtree pointers */ static gint ett_disp = -1; @@ -228,7 +229,7 @@ static gint ett_disp_ShadowError = -1; static gint ett_disp_T_signedShadowError = -1; /*--- End of included file: packet-disp-ett.c ---*/ -#line 53 "./asn1/disp/packet-disp-template.c" +#line 54 "./asn1/disp/packet-disp-template.c" static expert_field ei_disp_unsupported_opcode = EI_INIT; static expert_field ei_disp_unsupported_errcode = EI_INIT; @@ -249,6 +250,7 @@ static int dissect_disp_Subtree(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, in static int dissect_disp_IncrementalStepRefresh(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -1066,9 +1068,15 @@ static const ber_sequence_t Subtree_sequence[] = { static int dissect_disp_Subtree(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset, Subtree_sequence, hf_index, ett_disp_Subtree); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1224,9 +1232,15 @@ static const ber_sequence_t IncrementalStepRefresh_sequence[] = { static int dissect_disp_IncrementalStepRefresh(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset, IncrementalStepRefresh_sequence, hf_index, ett_disp_IncrementalStepRefresh); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1467,7 +1481,7 @@ static int dissect_ShadowingAgreementInfo_PDU(tvbuff_t *tvb _U_, packet_info *pi /*--- End of included file: packet-disp-fn.c ---*/ -#line 62 "./asn1/disp/packet-disp-template.c" +#line 63 "./asn1/disp/packet-disp-template.c" /* * Dissect DISP PDUs inside a ROS PDUs @@ -2025,7 +2039,7 @@ void proto_register_disp(void) { "ShadowErrorData", HFILL }}, /*--- End of included file: packet-disp-hfarr.c ---*/ -#line 187 "./asn1/disp/packet-disp-template.c" +#line 188 "./asn1/disp/packet-disp-template.c" }; /* List of subtrees */ @@ -2090,7 +2104,7 @@ void proto_register_disp(void) { &ett_disp_T_signedShadowError, /*--- End of included file: packet-disp-ettarr.c ---*/ -#line 193 "./asn1/disp/packet-disp-template.c" +#line 194 "./asn1/disp/packet-disp-template.c" }; static ei_register_info ei[] = { @@ -2139,7 +2153,7 @@ void proto_reg_handoff_disp(void) { /*--- End of included file: packet-disp-dis-tab.c ---*/ -#line 231 "./asn1/disp/packet-disp-template.c" +#line 232 "./asn1/disp/packet-disp-template.c" /* APPLICATION CONTEXT */ diff --git a/epan/dissectors/packet-glow.c b/epan/dissectors/packet-glow.c index 96792b432a9..3adc905fd75 100644 --- a/epan/dissectors/packet-glow.c +++ b/epan/dissectors/packet-glow.c @@ -21,6 +21,7 @@ # include "config.h" #include +#include #include "packet-ber.h" #define PNAME "Glow" @@ -131,7 +132,7 @@ static int hf_glow_qualifiedFunction = -1; /* QualifiedFunction */ static int hf_glow_qualifiedTemplate = -1; /* QualifiedTemplate */ /*--- End of included file: packet-glow-hf.c ---*/ -#line 28 "./asn1/glow/packet-glow-template.c" +#line 29 "./asn1/glow/packet-glow-template.c" /* Initialize the subtree pointers */ static int ett_glow = -1; @@ -183,7 +184,7 @@ static gint ett_glow_SEQUENCE_OF_RootElement = -1; static gint ett_glow_RootElement = -1; /*--- End of included file: packet-glow-ett.c ---*/ -#line 33 "./asn1/glow/packet-glow-template.c" +#line 34 "./asn1/glow/packet-glow-template.c" /*--- Included file: packet-glow-fn.c ---*/ @@ -202,6 +203,7 @@ static int dissect_glow_ElementCollection(gboolean implicit_tag _U_, tvbuff_t *t static int dissect_glow_Template(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -1102,9 +1104,15 @@ dissect_glow_SEQUENCE_OF_Element(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, i static int dissect_glow_ElementCollection(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 6; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset, hf_index, BER_CLASS_APP, 4, TRUE, dissect_glow_SEQUENCE_OF_Element); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1128,9 +1136,15 @@ dissect_glow_Parameter_U(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offse static int dissect_glow_Parameter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 6; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset, hf_index, BER_CLASS_APP, 1, TRUE, dissect_glow_Parameter_U); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1180,9 +1194,15 @@ dissect_glow_Template_U(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset static int dissect_glow_Template(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 9; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset, hf_index, BER_CLASS_APP, 24, TRUE, dissect_glow_Template_U); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1492,7 +1512,7 @@ static int dissect_Root_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tre /*--- End of included file: packet-glow-fn.c ---*/ -#line 35 "./asn1/glow/packet-glow-template.c" +#line 36 "./asn1/glow/packet-glow-template.c" static int dissect_glow(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) @@ -1898,7 +1918,7 @@ void proto_register_glow(void) { NULL, HFILL }}, /*--- End of included file: packet-glow-hfarr.c ---*/ -#line 60 "./asn1/glow/packet-glow-template.c" +#line 61 "./asn1/glow/packet-glow-template.c" }; /* List of subtrees */ @@ -1951,7 +1971,7 @@ void proto_register_glow(void) { &ett_glow_RootElement, /*--- End of included file: packet-glow-ettarr.c ---*/ -#line 66 "./asn1/glow/packet-glow-template.c" +#line 67 "./asn1/glow/packet-glow-template.c" }; diff --git a/epan/dissectors/packet-goose.c b/epan/dissectors/packet-goose.c index 9937af7314a..43b061e1fdb 100644 --- a/epan/dissectors/packet-goose.c +++ b/epan/dissectors/packet-goose.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -158,7 +159,7 @@ static int hf_goose_mMSString = -1; /* MMSString */ static int hf_goose_utc_time = -1; /* UtcTime */ /*--- End of included file: packet-goose-hf.c ---*/ -#line 90 "./asn1/goose/packet-goose-template.c" +#line 91 "./asn1/goose/packet-goose-template.c" /* Initialize the subtree pointers */ static int ett_r_goose = -1; @@ -193,7 +194,7 @@ static gint ett_goose_SEQUENCE_OF_Data = -1; static gint ett_goose_Data = -1; /*--- End of included file: packet-goose-ett.c ---*/ -#line 103 "./asn1/goose/packet-goose-template.c" +#line 104 "./asn1/goose/packet-goose-template.c" /*--- Included file: packet-goose-fn.c ---*/ @@ -204,6 +205,7 @@ static gint ett_goose_Data = -1; static int dissect_goose_Data(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -733,10 +735,16 @@ static const ber_choice_t Data_choice[] = { static int dissect_goose_Data(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, Data_choice, hf_index, ett_goose_Data, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -783,7 +791,7 @@ dissect_goose_GOOSEpdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset /*--- End of included file: packet-goose-fn.c ---*/ -#line 105 "./asn1/goose/packet-goose-template.c" +#line 106 "./asn1/goose/packet-goose-template.c" static dissector_handle_t goose_handle = NULL; static dissector_handle_t ositp_handle = NULL; @@ -1485,7 +1493,7 @@ void proto_register_goose(void) { "UtcTime", HFILL }}, /*--- End of included file: packet-goose-hfarr.c ---*/ -#line 566 "./asn1/goose/packet-goose-template.c" +#line 567 "./asn1/goose/packet-goose-template.c" }; /* List of subtrees */ @@ -1521,7 +1529,7 @@ void proto_register_goose(void) { &ett_goose_Data, /*--- End of included file: packet-goose-ettarr.c ---*/ -#line 580 "./asn1/goose/packet-goose-template.c" +#line 581 "./asn1/goose/packet-goose-template.c" }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-h225.c b/epan/dissectors/packet-h225.c index 222aa4c9ea3..6c74e3d86e1 100644 --- a/epan/dissectors/packet-h225.c +++ b/epan/dissectors/packet-h225.c @@ -1275,6 +1275,7 @@ static int dissect_h225_EnumeratedParameter(tvbuff_t *tvb _U_, int offset _U_, a /*int dissect_h225_GenericData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);*/ +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -4019,6 +4020,11 @@ static const per_sequence_t EnumeratedParameter_sequence[] = { static int dissect_h225_EnumeratedParameter(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 864 "./asn1/h225/h225.cnf" gef_ctx_t *parent_gefx; @@ -4028,6 +4034,7 @@ dissect_h225_EnumeratedParameter(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t * offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index, ett_h225_EnumeratedParameter, EnumeratedParameter_sequence); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); #line 869 "./asn1/h225/h225.cnf" actx->private_data = parent_gefx; @@ -4043,6 +4050,11 @@ static const per_sequence_t GenericData_sequence[] = { int dissect_h225_GenericData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 6; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 850 "./asn1/h225/h225.cnf" void *priv_data = actx->private_data; gef_ctx_t *gefx; @@ -4057,6 +4069,7 @@ dissect_h225_GenericData(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_ offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index, ett_h225_GenericData, GenericData_sequence); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); #line 860 "./asn1/h225/h225.cnf" actx->private_data = priv_data; diff --git a/epan/dissectors/packet-h245.c b/epan/dissectors/packet-h245.c index cb523c2f1d8..2990488283e 100644 --- a/epan/dissectors/packet-h245.c +++ b/epan/dissectors/packet-h245.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include "packet-tpkt.h" @@ -202,7 +203,7 @@ typedef enum _IndicationMessage_enum { } IndicationMessage_enum; /*--- End of included file: packet-h245-val.h ---*/ -#line 75 "./asn1/h245/packet-h245-template.c" +#line 76 "./asn1/h245/packet-h245-template.c" static const value_string h245_RequestMessage_short_vals[] = { { RequestMessage_nonStandard , "NSM" }, @@ -1909,7 +1910,7 @@ static int hf_h245_encrypted = -1; /* OCTET_STRING */ static int hf_h245_encryptedAlphanumeric = -1; /* EncryptedAlphanumeric */ /*--- End of included file: packet-h245-hf.c ---*/ -#line 375 "./asn1/h245/packet-h245-template.c" +#line 376 "./asn1/h245/packet-h245-template.c" /* Initialize the subtree pointers */ static int ett_h245 = -1; @@ -2410,7 +2411,7 @@ static gint ett_h245_FlowControlIndication = -1; static gint ett_h245_MobileMultilinkReconfigurationIndication = -1; /*--- End of included file: packet-h245-ett.c ---*/ -#line 380 "./asn1/h245/packet-h245-template.c" +#line 381 "./asn1/h245/packet-h245-template.c" /* Forward declarations */ static int dissect_h245_MultimediaSystemControlMessage(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); @@ -2449,6 +2450,7 @@ static int dissect_h245_AudioMode(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t static int dissect_h245_ModeElementType(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -3921,9 +3923,15 @@ static const per_sequence_t GenericParameter_sequence[] = { static int dissect_h245_GenericParameter(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index, ett_h245_GenericParameter, GenericParameter_sequence); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -5738,6 +5746,11 @@ static const per_choice_t VideoCapability_choice[] = { static int dissect_h245_VideoCapability(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 457 "./asn1/h245/h245.cnf" gint32 value; @@ -5749,6 +5762,7 @@ dissect_h245_VideoCapability(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -6056,6 +6070,11 @@ static const per_choice_t AudioCapability_choice[] = { static int dissect_h245_AudioCapability(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 450 "./asn1/h245/h245.cnf" gint32 value; @@ -6066,6 +6085,7 @@ dissect_h245_AudioCapability(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx codec_type = val_to_str(value, h245_AudioCapability_short_vals, ""); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -7236,6 +7256,11 @@ static const per_choice_t DataType_choice[] = { static int dissect_h245_DataType(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 5; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 1007 "./asn1/h245/h245.cnf" gint choice_index; @@ -7254,6 +7279,7 @@ if (upcoming_channel){ + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -9018,6 +9044,11 @@ static const per_sequence_t MultiplexElement_sequence[] = { static int dissect_h245_MultiplexElement(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 82 "./asn1/h245/h245.cnf" /*MultiplexElement*/ h223_mux_element* me = wmem_new(wmem_file_scope(), h223_mux_element); @@ -9028,6 +9059,7 @@ dissect_h245_MultiplexElement(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *act offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index, ett_h245_MultiplexElement, MultiplexElement_sequence); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -9655,6 +9687,11 @@ static const per_choice_t AudioMode_choice[] = { static int dissect_h245_AudioMode(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 472 "./asn1/h245/h245.cnf" gint32 value; @@ -9665,6 +9702,7 @@ dissect_h245_AudioMode(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, codec_type = val_to_str(value, h245_AudioMode_vals, ""); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -10012,10 +10050,16 @@ static const per_choice_t ModeElementType_choice[] = { static int dissect_h245_ModeElementType(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 6; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_per_choice(tvb, offset, actx, tree, hf_index, ett_h245_ModeElementType, ModeElementType_choice, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -14497,7 +14541,7 @@ static int dissect_OpenLogicalChannel_PDU(tvbuff_t *tvb _U_, packet_info *pinfo /*--- End of included file: packet-h245-fn.c ---*/ -#line 389 "./asn1/h245/packet-h245-template.c" +#line 390 "./asn1/h245/packet-h245-template.c" static int dissect_h245(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data _U_) @@ -20196,7 +20240,7 @@ void proto_register_h245(void) { NULL, HFILL }}, /*--- End of included file: packet-h245-hfarr.c ---*/ -#line 475 "./asn1/h245/packet-h245-template.c" +#line 476 "./asn1/h245/packet-h245-template.c" }; /* List of subtrees */ @@ -20699,7 +20743,7 @@ void proto_register_h245(void) { &ett_h245_MobileMultilinkReconfigurationIndication, /*--- End of included file: packet-h245-ettarr.c ---*/ -#line 482 "./asn1/h245/packet-h245-template.c" +#line 483 "./asn1/h245/packet-h245-template.c" }; module_t *h245_module; diff --git a/epan/dissectors/packet-h248.c b/epan/dissectors/packet-h248.c index 32c11e5b4ff..57d33c4c044 100644 --- a/epan/dissectors/packet-h248.c +++ b/epan/dissectors/packet-h248.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -392,7 +393,7 @@ static int hf_h248_NotifyCompletion_otherReason = -1; static int hf_h248_NotifyCompletion_onIteration = -1; /*--- End of included file: packet-h248-hf.c ---*/ -#line 69 "./asn1/h248/packet-h248-template.c" +#line 70 "./asn1/h248/packet-h248-template.c" /* Initialize the subtree pointers */ static gint ett_h248 = -1; @@ -560,7 +561,7 @@ static gint ett_h248_EventParameterV1 = -1; static gint ett_h248_SigParameterV1 = -1; /*--- End of included file: packet-h248-ett.c ---*/ -#line 89 "./asn1/h248/packet-h248-template.c" +#line 90 "./asn1/h248/packet-h248-template.c" static expert_field ei_h248_errored_command = EI_INIT; static expert_field ei_h248_transactionId64 = EI_INIT; @@ -2636,6 +2637,7 @@ static int dissect_h248_MtpAddress(gboolean implicit_tag, tvbuff_t *tvb, int off static int dissect_h248_SecondEventsDescriptor(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -4292,9 +4294,15 @@ static const ber_sequence_t SecondEventsDescriptor_sequence[] = { static int dissect_h248_SecondEventsDescriptor(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 7; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset, SecondEventsDescriptor_sequence, hf_index, ett_h248_SecondEventsDescriptor); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -6078,7 +6086,7 @@ dissect_h248_SigParameterV1(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of /*--- End of included file: packet-h248-fn.c ---*/ -#line 2156 "./asn1/h248/packet-h248-template.c" +#line 2157 "./asn1/h248/packet-h248-template.c" static int dissect_h248_tpkt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { dissect_tpkt_encap(tvb, pinfo, tree, h248_desegment, h248_handle); @@ -7503,7 +7511,7 @@ void proto_register_h248(void) { NULL, HFILL }}, /*--- End of included file: packet-h248-hfarr.c ---*/ -#line 2324 "./asn1/h248/packet-h248-template.c" +#line 2325 "./asn1/h248/packet-h248-template.c" GCP_HF_ARR_ELEMS("h248",h248_arrel) @@ -7669,7 +7677,7 @@ void proto_register_h248(void) { &ett_h248_SigParameterV1, /*--- End of included file: packet-h248-ettarr.c ---*/ -#line 2342 "./asn1/h248/packet-h248-template.c" +#line 2343 "./asn1/h248/packet-h248-template.c" }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-ieee1609dot2.c b/epan/dissectors/packet-ieee1609dot2.c index 031bf48bc53..a5d5e7051cb 100644 --- a/epan/dissectors/packet-ieee1609dot2.c +++ b/epan/dissectors/packet-ieee1609dot2.c @@ -318,6 +318,7 @@ ieee1609dot2_set_next_default_psid(packet_info *pinfo, guint32 psid) static int dissect_ieee1609dot2_SignedDataPayload(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -2086,9 +2087,15 @@ static const oer_sequence_t SignedDataPayload_sequence[] = { static int dissect_ieee1609dot2_SignedDataPayload(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 6; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_oer_sequence(tvb, offset, actx, tree, hf_index, ett_ieee1609dot2_SignedDataPayload, SignedDataPayload_sequence); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } diff --git a/epan/dissectors/packet-its.c b/epan/dissectors/packet-its.c index 0b35d1516ac..de27694fc62 100644 --- a/epan/dissectors/packet-its.c +++ b/epan/dissectors/packet-its.c @@ -1925,7 +1925,7 @@ static int hf_cpm_node_Z5 = -1; /* Offset_B14 */ static int hf_cpm_node_Z6 = -1; /* Offset_B16 */ /*--- End of included file: packet-its-hf.c ---*/ -#line 288 "./asn1/its/packet-its-template.c" +#line 289 "./asn1/its/packet-its-template.c" // CauseCode/SubCauseCode management static int hf_its_trafficConditionSubCauseCode = -1; @@ -2526,7 +2526,7 @@ static gint ett_cpm_OffsetPoint = -1; static gint ett_cpm_NodeOffsetPointZ = -1; /*--- End of included file: packet-its-ett.c ---*/ -#line 318 "./asn1/its/packet-its-template.c" +#line 319 "./asn1/its/packet-its-template.c" // Deal with cause/subcause code management struct { CauseCodeType_enum cause; int* hf; } cause_to_subcause[] = { @@ -11038,6 +11038,7 @@ static int dissect_AddGrpC_SignalStatusPackage_addGrpC_PDU(tvbuff_t *tvb _U_, pa static int dissect_gdd_GddStructure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -11962,9 +11963,15 @@ static const per_sequence_t gdd_GddStructure_sequence[] = { static int dissect_gdd_GddStructure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 9; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index, ett_gdd_GddStructure, gdd_GddStructure_sequence); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -18561,7 +18568,7 @@ static int dissect_cpm_CollectivePerceptionMessage_PDU(tvbuff_t *tvb _U_, packet /*--- End of included file: packet-its-fn.c ---*/ -#line 360 "./asn1/its/packet-its-template.c" +#line 361 "./asn1/its/packet-its-template.c" static void its_latitude_fmt(gchar *s, guint32 v) @@ -25364,7 +25371,7 @@ void proto_register_its(void) "Offset_B16", HFILL }}, /*--- End of included file: packet-its-hfarr.c ---*/ -#line 835 "./asn1/its/packet-its-template.c" +#line 836 "./asn1/its/packet-its-template.c" { &hf_its_roadworksSubCauseCode, { "roadworksSubCauseCode", "its.subCauseCode", @@ -26138,7 +26145,7 @@ void proto_register_its(void) &ett_cpm_NodeOffsetPointZ, /*--- End of included file: packet-its-ettarr.c ---*/ -#line 1038 "./asn1/its/packet-its-template.c" +#line 1039 "./asn1/its/packet-its-template.c" }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-ldap.c b/epan/dissectors/packet-ldap.c index 33c7a31dba9..c9427e60311 100644 --- a/epan/dissectors/packet-ldap.c +++ b/epan/dissectors/packet-ldap.c @@ -88,6 +88,7 @@ #include #include #include +#include #include #include #include @@ -336,7 +337,7 @@ static int hf_ldap_graceAuthNsRemaining = -1; /* INTEGER_0_maxInt */ static int hf_ldap_error = -1; /* T_error */ /*--- End of included file: packet-ldap-hf.c ---*/ -#line 186 "./asn1/ldap/packet-ldap-template.c" +#line 187 "./asn1/ldap/packet-ldap-template.c" /* Initialize the subtree pointers */ static gint ett_ldap = -1; @@ -408,7 +409,7 @@ static gint ett_ldap_PasswordPolicyResponseValue = -1; static gint ett_ldap_T_warning = -1; /*--- End of included file: packet-ldap-ett.c ---*/ -#line 198 "./asn1/ldap/packet-ldap-template.c" +#line 199 "./asn1/ldap/packet-ldap-template.c" static expert_field ei_ldap_exceeded_filter_length = EI_INIT; static expert_field ei_ldap_too_many_filter_elements = EI_INIT; @@ -1130,6 +1131,7 @@ ldap_match_call_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gu static int dissect_ldap_Filter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -2246,6 +2248,11 @@ static const ber_choice_t Filter_choice[] = { static int dissect_ldap_Filter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 661 "./asn1/ldap/ldap.cnf" proto_tree *tr; proto_item *it; @@ -2273,6 +2280,7 @@ dissect_ldap_Filter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_ + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -3815,7 +3823,7 @@ static int dissect_PasswordPolicyResponseValue_PDU(tvbuff_t *tvb _U_, packet_inf /*--- End of included file: packet-ldap-fn.c ---*/ -#line 909 "./asn1/ldap/packet-ldap-template.c" +#line 910 "./asn1/ldap/packet-ldap-template.c" static int dissect_LDAPMessage_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ldap_conv_info_t *ldap_info) { int offset = 0; @@ -5632,7 +5640,7 @@ void proto_register_ldap(void) { NULL, HFILL }}, /*--- End of included file: packet-ldap-hfarr.c ---*/ -#line 2157 "./asn1/ldap/packet-ldap-template.c" +#line 2158 "./asn1/ldap/packet-ldap-template.c" }; /* List of subtrees */ @@ -5706,7 +5714,7 @@ void proto_register_ldap(void) { &ett_ldap_T_warning, /*--- End of included file: packet-ldap-ettarr.c ---*/ -#line 2171 "./asn1/ldap/packet-ldap-template.c" +#line 2172 "./asn1/ldap/packet-ldap-template.c" }; /* UAT for header fields */ static uat_field_t custom_attribute_types_uat_fields[] = { @@ -5917,7 +5925,7 @@ proto_reg_handoff_ldap(void) /*--- End of included file: packet-ldap-dis-tab.c ---*/ -#line 2365 "./asn1/ldap/packet-ldap-template.c" +#line 2366 "./asn1/ldap/packet-ldap-template.c" dissector_add_uint_range_with_preference("tcp.port", TCP_PORT_RANGE_LDAP, ldap_handle); diff --git a/epan/dissectors/packet-mms.c b/epan/dissectors/packet-mms.c index 233bbb835c6..e7cbeb7aeae 100644 --- a/epan/dissectors/packet-mms.c +++ b/epan/dissectors/packet-mms.c @@ -1057,6 +1057,7 @@ static int dissect_mms_AlternateAccess(gboolean implicit_tag _U_, tvbuff_t *tvb static int dissect_mms_Data(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -1578,10 +1579,16 @@ static const ber_choice_t TypeSpecification_choice[] = { static int dissect_mms_TypeSpecification(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, TypeSpecification_choice, hf_index, ett_mms_TypeSpecification, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1763,9 +1770,15 @@ static const ber_sequence_t AlternateAccess_sequence_of[1] = { static int dissect_mms_AlternateAccess(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 5; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset, AlternateAccess_sequence_of, hf_index, ett_mms_AlternateAccess); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1819,10 +1832,16 @@ static const ber_choice_t VariableSpecification_choice[] = { static int dissect_mms_VariableSpecification(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, VariableSpecification_choice, hf_index, ett_mms_VariableSpecification, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -2108,10 +2127,16 @@ static const ber_choice_t Data_choice[] = { static int dissect_mms_Data(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, Data_choice, hf_index, ett_mms_Data, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } diff --git a/epan/dissectors/packet-p22.c b/epan/dissectors/packet-p22.c index f446ab88f4c..fb9aeb29c95 100644 --- a/epan/dissectors/packet-p22.c +++ b/epan/dissectors/packet-p22.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" @@ -323,7 +324,7 @@ static const value_string charsetreg_vals [] = { #define ub_telephone_number 32 /*--- End of included file: packet-p22-val.h ---*/ -#line 67 "./asn1/p22/packet-p22-template.c" +#line 68 "./asn1/p22/packet-p22-template.c" /*--- Included file: packet-p22-hf.c ---*/ @@ -708,7 +709,7 @@ static int hf_p22_RecipientSecurityRequest_ipn_non_repudiation = -1; static int hf_p22_RecipientSecurityRequest_ipn_proof = -1; /*--- End of included file: packet-p22-hf.c ---*/ -#line 69 "./asn1/p22/packet-p22-template.c" +#line 70 "./asn1/p22/packet-p22-template.c" /* Initialize the subtree pointers */ static gint ett_p22 = -1; @@ -842,7 +843,7 @@ static gint ett_p22_T_body_part_token_choice = -1; static gint ett_p22_T_choice = -1; /*--- End of included file: packet-p22-ett.c ---*/ -#line 73 "./asn1/p22/packet-p22-template.c" +#line 74 "./asn1/p22/packet-p22-template.c" /*--- Included file: packet-p22-fn.c ---*/ @@ -862,6 +863,7 @@ static int dissect_p22_BodyPartTokens(gboolean implicit_tag _U_, tvbuff_t *tvb _ static int dissect_p22_ForwardedContentToken(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -1834,6 +1836,11 @@ static const ber_sequence_t IPM_sequence[] = { int dissect_p22_IPM(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 7; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); #line 243 "./asn1/p22/p22.cnf" col_append_str(actx->pinfo->cinfo, COL_INFO, " Message"); @@ -1845,6 +1852,7 @@ dissect_p22_IPM(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, as + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -3557,9 +3565,15 @@ static const ber_sequence_t IPMSynopsis_sequence_of[1] = { static int dissect_p22_IPMSynopsis(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset, IPMSynopsis_sequence_of, hf_index, ett_p22_IPMSynopsis); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -4017,9 +4031,15 @@ static const ber_sequence_t BodyPartTokens_set_of[1] = { static int dissect_p22_BodyPartTokens(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset, BodyPartTokens_set_of, hf_index, ett_p22_BodyPartTokens); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -4067,9 +4087,15 @@ static const ber_sequence_t ForwardedContentToken_set_of[1] = { static int dissect_p22_ForwardedContentToken(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset, ForwardedContentToken_set_of, hf_index, ett_p22_ForwardedContentToken); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -4659,7 +4685,7 @@ static int dissect_ForwardedContentToken_PDU(tvbuff_t *tvb _U_, packet_info *pin /*--- End of included file: packet-p22-fn.c ---*/ -#line 75 "./asn1/p22/packet-p22-template.c" +#line 76 "./asn1/p22/packet-p22-template.c" /* * Dissect P22 PDUs inside a PPDU. @@ -6205,7 +6231,7 @@ void proto_register_p22(void) { NULL, HFILL }}, /*--- End of included file: packet-p22-hfarr.c ---*/ -#line 108 "./asn1/p22/packet-p22-template.c" +#line 109 "./asn1/p22/packet-p22-template.c" }; /* List of subtrees */ @@ -6341,7 +6367,7 @@ void proto_register_p22(void) { &ett_p22_T_choice, /*--- End of included file: packet-p22-ettarr.c ---*/ -#line 114 "./asn1/p22/packet-p22-template.c" +#line 115 "./asn1/p22/packet-p22-template.c" }; /* Register protocol */ @@ -6461,7 +6487,7 @@ void proto_reg_handoff_p22(void) { /*--- End of included file: packet-p22-dis-tab.c ---*/ -#line 130 "./asn1/p22/packet-p22-template.c" +#line 131 "./asn1/p22/packet-p22-template.c" register_ber_oid_dissector("2.6.1.10.0", dissect_p22, proto_p22, "InterPersonal Message (1984)"); register_ber_oid_dissector("2.6.1.10.1", dissect_p22, proto_p22, "InterPersonal Message (1988)"); diff --git a/epan/dissectors/packet-p7.c b/epan/dissectors/packet-p7.c index e9c24366e03..64bd635486a 100644 --- a/epan/dissectors/packet-p7.c +++ b/epan/dissectors/packet-p7.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-acse.h" @@ -104,7 +105,7 @@ static int proto_p7 = -1; #define ub_ua_restrictions 16 /*--- End of included file: packet-p7-val.h ---*/ -#line 41 "./asn1/p7/packet-p7-template.c" +#line 42 "./asn1/p7/packet-p7-template.c" /*--- Included file: packet-p7-hf.c ---*/ @@ -476,7 +477,7 @@ static int hf_p7_T_entry_class_problem_entry_class_not_subscribed = -1; static int hf_p7_T_entry_class_problem_inappropriate_entry_class = -1; /*--- End of included file: packet-p7-hf.c ---*/ -#line 43 "./asn1/p7/packet-p7-template.c" +#line 44 "./asn1/p7/packet-p7-template.c" /* Initialize the subtree pointers */ static gint ett_p7 = -1; @@ -618,7 +619,7 @@ static gint ett_p7_RTSE_apdus = -1; static gint ett_p7_RTABapdu = -1; /*--- End of included file: packet-p7-ett.c ---*/ -#line 47 "./asn1/p7/packet-p7-template.c" +#line 48 "./asn1/p7/packet-p7-template.c" /*--- Included file: packet-p7-table.c ---*/ @@ -661,7 +662,7 @@ static const value_string p7_err_code_string_vals[] = { /*--- End of included file: packet-p7-table.c ---*/ -#line 49 "./asn1/p7/packet-p7-template.c" +#line 50 "./asn1/p7/packet-p7-template.c" /*--- Included file: packet-p7-fn.c ---*/ @@ -673,6 +674,7 @@ static const value_string p7_err_code_string_vals[] = { static int dissect_p7_Filter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -1587,10 +1589,16 @@ static const ber_choice_t Filter_choice[] = { static int dissect_p7_Filter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, Filter_choice, hf_index, ett_p7_Filter, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -4106,7 +4114,7 @@ static int dissect_RTSE_apdus_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, pro /*--- End of included file: packet-p7-fn.c ---*/ -#line 51 "./asn1/p7/packet-p7-template.c" +#line 52 "./asn1/p7/packet-p7-template.c" /*--- Included file: packet-p7-table11.c ---*/ @@ -4138,7 +4146,7 @@ static const ros_opr_t p7_opr_tab[] = { /*--- End of included file: packet-p7-table11.c ---*/ -#line 53 "./asn1/p7/packet-p7-template.c" +#line 54 "./asn1/p7/packet-p7-template.c" /*--- Included file: packet-p7-table21.c ---*/ #line 1 "./asn1/p7/packet-p7-table21.c" @@ -4177,7 +4185,7 @@ static const ros_err_t p7_err_tab[] = { /*--- End of included file: packet-p7-table21.c ---*/ -#line 54 "./asn1/p7/packet-p7-template.c" +#line 55 "./asn1/p7/packet-p7-template.c" static const ros_info_t p7_ros_info = { "P7", @@ -5657,7 +5665,7 @@ void proto_register_p7(void) { NULL, HFILL }}, /*--- End of included file: packet-p7-hfarr.c ---*/ -#line 73 "./asn1/p7/packet-p7-template.c" +#line 74 "./asn1/p7/packet-p7-template.c" }; /* List of subtrees */ @@ -5801,7 +5809,7 @@ void proto_register_p7(void) { &ett_p7_RTABapdu, /*--- End of included file: packet-p7-ettarr.c ---*/ -#line 79 "./asn1/p7/packet-p7-template.c" +#line 80 "./asn1/p7/packet-p7-template.c" }; module_t *p7_module; @@ -5860,7 +5868,7 @@ void proto_reg_handoff_p7(void) { /*--- End of included file: packet-p7-dis-tab.c ---*/ -#line 105 "./asn1/p7/packet-p7-template.c" +#line 106 "./asn1/p7/packet-p7-template.c" /* APPLICATION CONTEXT */ diff --git a/epan/dissectors/packet-sv.c b/epan/dissectors/packet-sv.c index 88caa0fbc62..ab5e8b30b5a 100644 --- a/epan/dissectors/packet-sv.c +++ b/epan/dissectors/packet-sv.c @@ -118,7 +118,7 @@ static int hf_sv_smpMod = -1; /* T_smpMod */ static int hf_sv_gmidData = -1; /* GmidData */ /*--- End of included file: packet-sv-hf.c ---*/ -#line 94 "./asn1/sv/packet-sv-template.c" +#line 95 "./asn1/sv/packet-sv-template.c" /* Initialize the subtree pointers */ static int ett_sv = -1; @@ -137,7 +137,7 @@ static gint ett_sv_SEQUENCE_OF_ASDU = -1; static gint ett_sv_ASDU = -1; /*--- End of included file: packet-sv-ett.c ---*/ -#line 104 "./asn1/sv/packet-sv-template.c" +#line 105 "./asn1/sv/packet-sv-template.c" static expert_field ei_sv_mal_utctime = EI_INIT; static expert_field ei_sv_zero_pdu = EI_INIT; @@ -491,7 +491,7 @@ dissect_sv_SampledValues(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offse /*--- End of included file: packet-sv-fn.c ---*/ -#line 187 "./asn1/sv/packet-sv-template.c" +#line 199 "./asn1/sv/packet-sv-template.c" /* * Dissect SV PDUs inside a PPDU. @@ -684,7 +684,7 @@ void proto_register_sv(void) { NULL, HFILL }}, /*--- End of included file: packet-sv-hfarr.c ---*/ -#line 319 "./asn1/sv/packet-sv-template.c" +#line 331 "./asn1/sv/packet-sv-template.c" }; /* List of subtrees */ @@ -703,7 +703,7 @@ void proto_register_sv(void) { &ett_sv_ASDU, /*--- End of included file: packet-sv-ettarr.c ---*/ -#line 329 "./asn1/sv/packet-sv-template.c" +#line 341 "./asn1/sv/packet-sv-template.c" }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-x509if.c b/epan/dissectors/packet-x509if.c index 50320220a0e..65c3c1ac7e6 100644 --- a/epan/dissectors/packet-x509if.c +++ b/epan/dissectors/packet-x509if.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "packet-ber.h" @@ -201,7 +202,7 @@ static int hf_x509if_AllowedSubset_oneLevel = -1; static int hf_x509if_AllowedSubset_wholeSubtree = -1; /*--- End of included file: packet-x509if-hf.c ---*/ -#line 37 "./asn1/x509if/packet-x509if-template.c" +#line 38 "./asn1/x509if/packet-x509if-template.c" /* Initialize the subtree pointers */ @@ -282,7 +283,7 @@ static gint ett_x509if_SEQUENCE_SIZE_1_MAX_OF_AttributeType = -1; static gint ett_x509if_SET_SIZE_1_MAX_OF_DirectoryString = -1; /*--- End of included file: packet-x509if-ett.c ---*/ -#line 40 "./asn1/x509if/packet-x509if-template.c" +#line 41 "./asn1/x509if/packet-x509if-template.c" static proto_tree *top_of_dn = NULL; static proto_tree *top_of_rdn = NULL; @@ -336,6 +337,7 @@ x509if_frame_end(void) /*int dissect_x509if_AttributeCombination(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);*/ +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -1096,10 +1098,16 @@ static const ber_choice_t Refinement_choice[] = { int dissect_x509if_Refinement(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, Refinement_choice, hf_index, ett_x509if_Refinement, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1541,10 +1549,16 @@ static const ber_choice_t ContextCombination_choice[] = { int dissect_x509if_ContextCombination(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, ContextCombination_choice, hf_index, ett_x509if_ContextCombination, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1662,10 +1676,16 @@ static const ber_choice_t AttributeCombination_choice[] = { int dissect_x509if_AttributeCombination(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, AttributeCombination_choice, hf_index, ett_x509if_AttributeCombination, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -2090,7 +2110,7 @@ static int dissect_HierarchyBelow_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, /*--- End of included file: packet-x509if-fn.c ---*/ -#line 76 "./asn1/x509if/packet-x509if-template.c" +#line 77 "./asn1/x509if/packet-x509if-template.c" const char * x509if_get_last_dn(void) { @@ -2756,7 +2776,7 @@ void proto_register_x509if(void) { NULL, HFILL }}, /*--- End of included file: packet-x509if-hfarr.c ---*/ -#line 121 "./asn1/x509if/packet-x509if-template.c" +#line 122 "./asn1/x509if/packet-x509if-template.c" }; /* List of subtrees */ @@ -2839,7 +2859,7 @@ void proto_register_x509if(void) { &ett_x509if_SET_SIZE_1_MAX_OF_DirectoryString, /*--- End of included file: packet-x509if-ettarr.c ---*/ -#line 126 "./asn1/x509if/packet-x509if-template.c" +#line 127 "./asn1/x509if/packet-x509if-template.c" }; /* Register protocol */ @@ -2897,6 +2917,6 @@ void proto_reg_handoff_x509if(void) { /*--- End of included file: packet-x509if-dis-tab.c ---*/ -#line 145 "./asn1/x509if/packet-x509if-template.c" +#line 146 "./asn1/x509if/packet-x509if-template.c" } diff --git a/epan/dissectors/packet-x509sat.c b/epan/dissectors/packet-x509sat.c index 876b9831ca3..8c533081847 100644 --- a/epan/dissectors/packet-x509sat.c +++ b/epan/dissectors/packet-x509sat.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "packet-ber.h" #include "packet-p1.h" @@ -207,7 +208,7 @@ static int hf_x509sat_T_bitNamedDays_friday = -1; static int hf_x509sat_T_bitNamedDays_saturday = -1; /*--- End of included file: packet-x509sat-hf.c ---*/ -#line 33 "./asn1/x509sat/packet-x509sat-template.c" +#line 34 "./asn1/x509sat/packet-x509sat-template.c" /* Initialize the subtree pointers */ @@ -262,7 +263,7 @@ static gint ett_x509sat_T_between = -1; static gint ett_x509sat_LocaleContextSyntax = -1; /*--- End of included file: packet-x509sat-ett.c ---*/ -#line 36 "./asn1/x509sat/packet-x509sat-template.c" +#line 37 "./asn1/x509sat/packet-x509sat-template.c" /*--- Included file: packet-x509sat-fn.c ---*/ @@ -274,6 +275,7 @@ static gint ett_x509sat_LocaleContextSyntax = -1; /*int dissect_x509sat_Criteria(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);*/ +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -448,10 +450,16 @@ static const ber_choice_t Criteria_choice[] = { int dissect_x509sat_Criteria(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, Criteria_choice, hf_index, ett_x509sat_Criteria, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -1906,7 +1914,7 @@ static int dissect_GUID_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tre /*--- End of included file: packet-x509sat-fn.c ---*/ -#line 38 "./asn1/x509sat/packet-x509sat-template.c" +#line 39 "./asn1/x509sat/packet-x509sat-template.c" /*--- proto_register_x509sat ----------------------------------------------*/ @@ -2575,7 +2583,7 @@ void proto_register_x509sat(void) { NULL, HFILL }}, /*--- End of included file: packet-x509sat-hfarr.c ---*/ -#line 46 "./asn1/x509sat/packet-x509sat-template.c" +#line 47 "./asn1/x509sat/packet-x509sat-template.c" }; /* List of subtrees */ @@ -2632,7 +2640,7 @@ void proto_register_x509sat(void) { &ett_x509sat_LocaleContextSyntax, /*--- End of included file: packet-x509sat-ettarr.c ---*/ -#line 51 "./asn1/x509sat/packet-x509sat-template.c" +#line 52 "./asn1/x509sat/packet-x509sat-template.c" }; /* Register protocol */ @@ -2685,7 +2693,7 @@ void proto_register_x509sat(void) { register_ber_syntax_dissector("X121Address", proto_x509sat, dissect_X121Address_PDU); /*--- End of included file: packet-x509sat-syn-reg.c ---*/ -#line 61 "./asn1/x509sat/packet-x509sat-template.c" +#line 62 "./asn1/x509sat/packet-x509sat-template.c" } @@ -2878,7 +2886,7 @@ void proto_reg_handoff_x509sat(void) { /*--- End of included file: packet-x509sat-dis-tab.c ---*/ -#line 68 "./asn1/x509sat/packet-x509sat-template.c" +#line 69 "./asn1/x509sat/packet-x509sat-template.c" /* OBJECT CLASSES */ diff --git a/epan/dissectors/packet-z3950.c b/epan/dissectors/packet-z3950.c index 3ad54b0ee10..e25a2e7c1e8 100644 --- a/epan/dissectors/packet-z3950.c +++ b/epan/dissectors/packet-z3950.c @@ -2088,6 +2088,7 @@ static int dissect_z3950_ElementInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U static int dissect_z3950_TaggedElement(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_); +#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen. static int @@ -3067,10 +3068,16 @@ static const ber_choice_t RPNStructure_choice[] = { static int dissect_z3950_RPNStructure(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 3; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_choice(actx, tree, tvb, offset, RPNStructure_choice, hf_index, ett_z3950_RPNStructure, NULL); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -6584,9 +6591,15 @@ static const ber_sequence_t ElementInfo_sequence[] = { static int dissect_z3950_ElementInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset, ElementInfo_sequence, hf_index, ett_z3950_ElementInfo); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } @@ -8059,9 +8072,15 @@ static const ber_sequence_t TaggedElement_sequence[] = { static int dissect_z3950_TaggedElement(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) { + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = 4; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset, TaggedElement_sequence, hf_index, ett_z3950_TaggedElement); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); return offset; } diff --git a/tools/asn2wrs.py b/tools/asn2wrs.py index db199b6a253..9f50738a3b4 100755 --- a/tools/asn2wrs.py +++ b/tools/asn2wrs.py @@ -1548,6 +1548,23 @@ class EthCtx: if self.conform.check_item('PDU', tname): out += self.output_proto_root() + cycle_size = 0 + if self.eth_dep_cycle: + for cur_cycle in self.eth_dep_cycle: + t = self.type[cur_cycle[0]]['ethname'] + if t == tname: + cycle_size = len(cur_cycle) + break + + if cycle_size > 0: + out += f'''\ + const int proto_id = GPOINTER_TO_INT(wmem_list_frame_data(wmem_list_tail(actx->pinfo->layers))); + const unsigned cycle_size = {cycle_size}; + unsigned recursion_depth = p_get_proto_depth(actx->pinfo, proto_id); + DISSECTOR_ASSERT(recursion_depth <= MAX_RECURSION_DEPTH); + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth + cycle_size); +''' + if self.conform.get_fn_presence(self.eth_type[tname]['ref'][0]): out += self.conform.get_fn_text(self.eth_type[tname]['ref'][0], 'FN_HDR') return out @@ -1558,6 +1575,20 @@ class EthCtx: #if self.conform.get_fn_presence(tname): # out += self.conform.get_fn_text(tname, 'FN_FTR') #el + + add_recursion_check = False + if self.eth_dep_cycle: + for cur_cycle in self.eth_dep_cycle: + t = self.type[cur_cycle[0]]['ethname'] + if t == tname: + add_recursion_check = True + break + + if add_recursion_check: + out += '''\ + p_set_proto_depth(actx->pinfo, proto_id, recursion_depth - cycle_size); +''' + if self.conform.get_fn_presence(self.eth_type[tname]['ref'][0]): out += self.conform.get_fn_text(self.eth_type[tname]['ref'][0], 'FN_FTR') out += " return offset;\n" @@ -1825,12 +1856,15 @@ class EthCtx: fx.write(self.eth_out_pdu_decl(f)) if not first_decl: fx.write('\n') + + add_depth_define = False if self.eth_dep_cycle: fx.write('/*--- Cyclic dependencies ---*/\n\n') i = 0 while i < len(self.eth_dep_cycle): t = self.type[self.eth_dep_cycle[i][0]]['ethname'] if self.dep_cycle_eth_type[t][0] != i: i += 1; continue + add_depth_define = True fx.write(''.join(['/* %s */\n' % ' -> '.join(self.eth_dep_cycle[i]) for i in self.dep_cycle_eth_type[t]])) if not self.eth_type[t]['export'] & EF_TYPE: fx.write(self.eth_type_fn_h(t)) @@ -1839,6 +1873,8 @@ class EthCtx: fx.write('\n') i += 1 fx.write('\n') + if add_depth_define: + fx.write('#define MAX_RECURSION_DEPTH 100 // Arbitrarily chosen.\n') for t in self.eth_type_ord1: if self.eth_type[t]['import']: continue -- GitLab