153aa9179Sopenharmony_ciFrom 9f7b114232904a7d0e304bff30ed4b255f34a572 Mon Sep 17 00:00:00 2001 253aa9179Sopenharmony_ciFrom: Nick Wellnhofer <wellnhofer@aevum.de> 353aa9179Sopenharmony_ciDate: Thu, 9 Mar 2023 05:25:09 +0100 453aa9179Sopenharmony_ciSubject: [PATCH] regexp: Fix cycle check in xmlFAReduceEpsilonTransitions 553aa9179Sopenharmony_ci 653aa9179Sopenharmony_ciThe visited flag must only be reset after the first call to 753aa9179Sopenharmony_cixmlFAReduceEpsilonTransitions has finished. Visiting states multiple 853aa9179Sopenharmony_citimes could lead to unnecessary processing of duplicate transitions. 953aa9179Sopenharmony_ci 1053aa9179Sopenharmony_ciSimilar to 68eadabd. 1153aa9179Sopenharmony_ci 1253aa9179Sopenharmony_ciReference:https://github.com/GNOME/libxml2/commit/9f7b114232904a7d0e304bff30ed4b255f34a572 1353aa9179Sopenharmony_ciConflict:NA 1453aa9179Sopenharmony_ci 1553aa9179Sopenharmony_ci--- 1653aa9179Sopenharmony_ci xmlregexp.c | 26 ++++++++++++++++++++++++++ 1753aa9179Sopenharmony_ci 1 file changed, 26 insertions(+) 1853aa9179Sopenharmony_ci 1953aa9179Sopenharmony_cidiff --git a/xmlregexp.c b/xmlregexp.c 2053aa9179Sopenharmony_ciindex cc4ae6f..24f9fc0 100644 2153aa9179Sopenharmony_ci--- a/xmlregexp.c 2253aa9179Sopenharmony_ci+++ b/xmlregexp.c 2353aa9179Sopenharmony_ci@@ -1880,7 +1880,32 @@ xmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, 2453aa9179Sopenharmony_ci } 2553aa9179Sopenharmony_ci } 2653aa9179Sopenharmony_ci } 2753aa9179Sopenharmony_ci+} 2853aa9179Sopenharmony_ci+ 2953aa9179Sopenharmony_ci+/** 3053aa9179Sopenharmony_ci+ * xmlFAFinishReduceEpsilonTransitions: 3153aa9179Sopenharmony_ci+ * @ctxt: a regexp parser context 3253aa9179Sopenharmony_ci+ * @fromnr: the from state 3353aa9179Sopenharmony_ci+ * @tonr: the to state 3453aa9179Sopenharmony_ci+ * @counter: should that transition be associated to a counted 3553aa9179Sopenharmony_ci+ * 3653aa9179Sopenharmony_ci+ */ 3753aa9179Sopenharmony_ci+static void 3853aa9179Sopenharmony_ci+xmlFAFinishReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int tonr) { 3953aa9179Sopenharmony_ci+ int transnr; 4053aa9179Sopenharmony_ci+ xmlRegStatePtr to; 4153aa9179Sopenharmony_ci+ 4253aa9179Sopenharmony_ci+ to = ctxt->states[tonr]; 4353aa9179Sopenharmony_ci+ if ((to->mark == XML_REGEXP_MARK_START) || 4453aa9179Sopenharmony_ci+ (to->mark == XML_REGEXP_MARK_NORMAL)) 4553aa9179Sopenharmony_ci+ return; 4653aa9179Sopenharmony_ci+ 4753aa9179Sopenharmony_ci to->mark = XML_REGEXP_MARK_NORMAL; 4853aa9179Sopenharmony_ci+ for (transnr = 0;transnr < to->nbTrans;transnr++) { 4953aa9179Sopenharmony_ci+ xmlRegTransPtr t1 = &to->trans[transnr]; 5053aa9179Sopenharmony_ci+ if ((t1->to >= 0) && (t1->atom == NULL)) 5153aa9179Sopenharmony_ci+ xmlFAFinishReduceEpsilonTransitions(ctxt, t1->to); 5253aa9179Sopenharmony_ci+ } 5353aa9179Sopenharmony_ci } 5453aa9179Sopenharmony_ci 5553aa9179Sopenharmony_ci /** 5653aa9179Sopenharmony_ci@@ -2032,6 +2057,7 @@ xmlFAEliminateEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { 5753aa9179Sopenharmony_ci state->mark = XML_REGEXP_MARK_START; 5853aa9179Sopenharmony_ci xmlFAReduceEpsilonTransitions(ctxt, statenr, 5953aa9179Sopenharmony_ci newto, state->trans[transnr].counter); 6053aa9179Sopenharmony_ci+ xmlFAFinishReduceEpsilonTransitions(ctxt, newto); 6153aa9179Sopenharmony_ci state->mark = XML_REGEXP_MARK_NORMAL; 6253aa9179Sopenharmony_ci #ifdef DEBUG_REGEXP_GRAPH 6353aa9179Sopenharmony_ci } else { 6453aa9179Sopenharmony_ci-- 6553aa9179Sopenharmony_ci2.27.0 6653aa9179Sopenharmony_ci 67