diff --git a/CVE-2024-0208.patch b/CVE-2024-0208.patch new file mode 100644 index 0000000000000000000000000000000000000000..2420a119d767bcd9b58a38b10fd49588ad51de96 --- /dev/null +++ b/CVE-2024-0208.patch @@ -0,0 +1,42 @@ +From 4953fa99e78ce86e98c18d438dac00669956965c Mon Sep 17 00:00:00 2001 +From: John Thacker +Date: Thu, 23 Nov 2023 13:47:51 -0500 +Subject: [PATCH] gvcp: Don't try to add a NULL string to a column + +Origin: https://gitlab.com/wireshark/wireshark/-/merge_requests/13417 + +This was caught as an invalid argument by g_strlcpy before 4.2, +but it was never a good idea. + +Fix #19496 + +(backported from commit a8586fde3a6512466afb2a660538ef3fe712076b) +--- + epan/dissectors/packet-gvcp.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/epan/dissectors/packet-gvcp.c b/epan/dissectors/packet-gvcp.c +index a7c13684f03..732db590e4a 100644 +--- a/epan/dissectors/packet-gvcp.c ++++ b/epan/dissectors/packet-gvcp.c +@@ -2222,15 +2222,12 @@ static void dissect_readreg_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, p + if (addr_list_size > 0) + { + address_string = get_register_name_from_address(*((guint32*)wmem_array_index(gvcp_trans->addr_list, 0)), gvcp_info, &is_custom_register); ++ col_append_str(pinfo->cinfo, COL_INFO, address_string); + } + + if (num_registers) + { +- col_append_fstr(pinfo->cinfo, COL_INFO, "%s Value=0x%08X", address_string, tvb_get_ntohl(tvb, offset)); +- } +- else +- { +- col_append_str(pinfo->cinfo, COL_INFO, address_string); ++ col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "Value=0x%08X", tvb_get_ntohl(tvb, offset)); + } + } + } +-- +GitLab + diff --git a/CVE-2024-0209.patch b/CVE-2024-0209.patch new file mode 100644 index 0000000000000000000000000000000000000000..7fb09a93d77d48454bf4a899fdbbb187673662c2 --- /dev/null +++ b/CVE-2024-0209.patch @@ -0,0 +1,2197 @@ +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 + diff --git a/wireshark.spec b/wireshark.spec index 1e2ada790e3a4dba8e809ad333af3fecb975520f..41dd303e84415a005d394e3e9ecdae24206637d6 100644 --- a/wireshark.spec +++ b/wireshark.spec @@ -5,7 +5,7 @@ Summary: Network traffic analyzer Name: wireshark Version: 3.6.14 -Release: 5 +Release: 6 Epoch: 1 License: GPL+ Url: http://www.wireshark.org/ @@ -30,6 +30,8 @@ Patch13: CVE-2023-4511.patch Patch14: CVE-2023-5371.patch # https://gitlab.com/wireshark/wireshark/-/commit/197e96f05303af0340b7e626f2b15c2edbf350b0 Patch15: CVE-2023-6175.patch +Patch16: CVE-2024-0208.patch +Patch17: CVE-2024-0209.patch Requires: xdg-utils Requires: hicolor-icon-theme @@ -204,6 +206,9 @@ exit 0 %{_mandir}/man?/* %changelog +* Thu Jan 04 2024 wangkai <13474090681@163.com> - 1:3.6.14-6 +- Fix CVE-2024-0208,CVE-2024-0209 + * Tue Nov 21 2023 yaoxin - 1:3.6.14-5 - Fix CVE-2023-6175