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