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