153aa9179Sopenharmony_ciFrom cb1b8b8516ade9add9f63fa0e39eaa3bc7034828 Mon Sep 17 00:00:00 2001
253aa9179Sopenharmony_ciFrom: David Kilzer <ddkilzer@apple.com>
353aa9179Sopenharmony_ciDate: Mon, 10 Apr 2023 13:06:18 -0700
453aa9179Sopenharmony_ciSubject: [PATCH] xmlValidatePopElement() can return invalid value (-1)
553aa9179Sopenharmony_ci
653aa9179Sopenharmony_ciCovered by:  test/VC/ElementValid5
753aa9179Sopenharmony_ci
853aa9179Sopenharmony_ciThis only affects XML Reader API with LIBXML_REGEXP_ENABLED and
953aa9179Sopenharmony_ciLIBXML_VALID_ENABLED turned on.
1053aa9179Sopenharmony_ci
1153aa9179Sopenharmony_ci* result/VC/ElementValid5.rdr:
1253aa9179Sopenharmony_ci- Update result to add missing error message.
1353aa9179Sopenharmony_ci
1453aa9179Sopenharmony_ci* python/tests/reader2.py:
1553aa9179Sopenharmony_ci* result/VC/ElementValid6.rdr:
1653aa9179Sopenharmony_ci* result/VC/ElementValid7.rdr:
1753aa9179Sopenharmony_ci* result/valid/781333.xml.err.rdr:
1853aa9179Sopenharmony_ci- Update result to fix grammar issue.
1953aa9179Sopenharmony_ci
2053aa9179Sopenharmony_ci* valid.c:
2153aa9179Sopenharmony_ci(xmlValidatePopElement):
2253aa9179Sopenharmony_ci- Check return value of xmlRegExecPushString() to handle -1, and
2353aa9179Sopenharmony_ci  assign 'ret = 0;' to return 0 from xmlValidatePopElement().
2453aa9179Sopenharmony_ci  This change affects xmlTextReaderValidatePop() from
2553aa9179Sopenharmony_ci  xmlreader.c.
2653aa9179Sopenharmony_ci- Fix grammar of error message by changing 'child' to
2753aa9179Sopenharmony_ci  'children'.
2853aa9179Sopenharmony_ci
2953aa9179Sopenharmony_ciReference:https://github.com/GNOME/libxml2/commit/cb1b8b8516ade9add9f63fa0e39eaa3bc7034828
3053aa9179Sopenharmony_ciConflict:python/tests/reader2.py
3153aa9179Sopenharmony_ci
3253aa9179Sopenharmony_ci---
3353aa9179Sopenharmony_ci python/tests/reader2.py         | 2 +-
3453aa9179Sopenharmony_ci result/VC/ElementValid5.rdr     | 3 +++
3553aa9179Sopenharmony_ci result/VC/ElementValid6.rdr     | 2 +-
3653aa9179Sopenharmony_ci result/VC/ElementValid7.rdr     | 2 +-
3753aa9179Sopenharmony_ci result/valid/781333.xml.err.rdr | 2 +-
3853aa9179Sopenharmony_ci valid.c                         | 5 +++--
3953aa9179Sopenharmony_ci 6 files changed, 10 insertions(+), 6 deletions(-)
4053aa9179Sopenharmony_ci
4153aa9179Sopenharmony_cidiff --git a/python/tests/reader2.py b/python/tests/reader2.py
4253aa9179Sopenharmony_ciindex b50180d..b581674 100755
4353aa9179Sopenharmony_ci--- a/python/tests/reader2.py
4453aa9179Sopenharmony_ci+++ b/python/tests/reader2.py
4553aa9179Sopenharmony_ci@@ -39,7 +39,7 @@ value
4653aa9179Sopenharmony_ci """../../test/valid/781333.xml:4: element a: validity error : Element a content does not follow the DTD, expecting ( ..., got 
4753aa9179Sopenharmony_ci <a/>
4853aa9179Sopenharmony_ci     ^
4953aa9179Sopenharmony_ci-../../test/valid/781333.xml:5: element a: validity error : Element a content does not follow the DTD, Expecting more child
5053aa9179Sopenharmony_ci+../../test/valid/781333.xml:5: element a: validity error : Element a content does not follow the DTD, Expecting more children
5153aa9179Sopenharmony_ci 
5253aa9179Sopenharmony_ci ^
5353aa9179Sopenharmony_ci """,
5453aa9179Sopenharmony_cidiff --git a/result/VC/ElementValid5.rdr b/result/VC/ElementValid5.rdr
5553aa9179Sopenharmony_ciindex 899d759..91eef9c 100644
5653aa9179Sopenharmony_ci--- a/result/VC/ElementValid5.rdr
5753aa9179Sopenharmony_ci+++ b/result/VC/ElementValid5.rdr
5853aa9179Sopenharmony_ci@@ -4,3 +4,6 @@
5953aa9179Sopenharmony_ci ./test/VC/ElementValid5:8: element doc: validity error : Element doc content does not follow the DTD, Misplaced b
6053aa9179Sopenharmony_ci 
6153aa9179Sopenharmony_ci ^
6253aa9179Sopenharmony_ci+./test/VC/ElementValid5:8: element doc: validity error : Element doc content does not follow the DTD, Expecting more children
6353aa9179Sopenharmony_ci+
6453aa9179Sopenharmony_ci+^
6553aa9179Sopenharmony_cidiff --git a/result/VC/ElementValid6.rdr b/result/VC/ElementValid6.rdr
6653aa9179Sopenharmony_ciindex aeafd6b..3b51d1a 100644
6753aa9179Sopenharmony_ci--- a/result/VC/ElementValid6.rdr
6853aa9179Sopenharmony_ci+++ b/result/VC/ElementValid6.rdr
6953aa9179Sopenharmony_ci@@ -1,6 +1,6 @@
7053aa9179Sopenharmony_ci ./test/VC/ElementValid6:7: element doc: validity error : Element doc content does not follow the DTD, expecting (a , b? , c+)?, got (a b)
7153aa9179Sopenharmony_ci <doc><a/><b>lacks c</b></doc>
7253aa9179Sopenharmony_ci                              ^
7353aa9179Sopenharmony_ci-./test/VC/ElementValid6:8: element doc: validity error : Element doc content does not follow the DTD, Expecting more child
7453aa9179Sopenharmony_ci+./test/VC/ElementValid6:8: element doc: validity error : Element doc content does not follow the DTD, Expecting more children
7553aa9179Sopenharmony_ci 
7653aa9179Sopenharmony_ci ^
7753aa9179Sopenharmony_cidiff --git a/result/VC/ElementValid7.rdr b/result/VC/ElementValid7.rdr
7853aa9179Sopenharmony_ciindex f001fd2..ecafd1d 100644
7953aa9179Sopenharmony_ci--- a/result/VC/ElementValid7.rdr
8053aa9179Sopenharmony_ci+++ b/result/VC/ElementValid7.rdr
8153aa9179Sopenharmony_ci@@ -1,6 +1,6 @@
8253aa9179Sopenharmony_ci ./test/VC/ElementValid7:7: element doc: validity error : Element doc content does not follow the DTD, expecting ((a | b)* , c+ , a , b? , c , a?), got (a b a c c a)
8353aa9179Sopenharmony_ci <doc><a/><b/><a/><c/><c/><a/></doc>
8453aa9179Sopenharmony_ci                                    ^
8553aa9179Sopenharmony_ci-./test/VC/ElementValid7:8: element doc: validity error : Element doc content does not follow the DTD, Expecting more child
8653aa9179Sopenharmony_ci+./test/VC/ElementValid7:8: element doc: validity error : Element doc content does not follow the DTD, Expecting more children
8753aa9179Sopenharmony_ci 
8853aa9179Sopenharmony_ci ^
8953aa9179Sopenharmony_cidiff --git a/result/valid/781333.xml.err.rdr b/result/valid/781333.xml.err.rdr
9053aa9179Sopenharmony_ciindex 5ff5699..dd9df08 100644
9153aa9179Sopenharmony_ci--- a/result/valid/781333.xml.err.rdr
9253aa9179Sopenharmony_ci+++ b/result/valid/781333.xml.err.rdr
9353aa9179Sopenharmony_ci@@ -1,6 +1,6 @@
9453aa9179Sopenharmony_ci ./test/valid/781333.xml:4: element a: validity error : Element a content does not follow the DTD, expecting ( ..., got 
9553aa9179Sopenharmony_ci <a/>
9653aa9179Sopenharmony_ci     ^
9753aa9179Sopenharmony_ci-./test/valid/781333.xml:5: element a: validity error : Element a content does not follow the DTD, Expecting more child
9853aa9179Sopenharmony_ci+./test/valid/781333.xml:5: element a: validity error : Element a content does not follow the DTD, Expecting more children
9953aa9179Sopenharmony_ci 
10053aa9179Sopenharmony_ci ^
10153aa9179Sopenharmony_cidiff --git a/valid.c b/valid.c
10253aa9179Sopenharmony_ciindex 3c0a869..92aaedb 100644
10353aa9179Sopenharmony_ci--- a/valid.c
10453aa9179Sopenharmony_ci+++ b/valid.c
10553aa9179Sopenharmony_ci@@ -6012,11 +6012,12 @@ xmlValidatePopElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc ATTRIBUTE_UNUSED,
10653aa9179Sopenharmony_ci 	    if (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT) {
10753aa9179Sopenharmony_ci 		if (state->exec != NULL) {
10853aa9179Sopenharmony_ci 		    ret = xmlRegExecPushString(state->exec, NULL, NULL);
10953aa9179Sopenharmony_ci-		    if (ret == 0) {
11053aa9179Sopenharmony_ci+		    if (ret <= 0) {
11153aa9179Sopenharmony_ci 			xmlErrValidNode(ctxt, state->node,
11253aa9179Sopenharmony_ci 			                XML_DTD_CONTENT_MODEL,
11353aa9179Sopenharmony_ci-	   "Element %s content does not follow the DTD, Expecting more child\n",
11453aa9179Sopenharmony_ci+	   "Element %s content does not follow the DTD, Expecting more children\n",
11553aa9179Sopenharmony_ci 			       state->node->name, NULL,NULL);
11653aa9179Sopenharmony_ci+			ret = 0;
11753aa9179Sopenharmony_ci 		    } else {
11853aa9179Sopenharmony_ci 			/*
11953aa9179Sopenharmony_ci 			 * previous validation errors should not generate
12053aa9179Sopenharmony_ci-- 
12153aa9179Sopenharmony_ci2.27.0
12253aa9179Sopenharmony_ci
123