153aa9179Sopenharmony_ciFrom 003d0baef83a3c694fba6f194cfc8c14bc035082 Mon Sep 17 00:00:00 2001
253aa9179Sopenharmony_ciFrom: Nick Wellnhofer <wellnhofer@aevum.de>
353aa9179Sopenharmony_ciDate: Mon, 21 Nov 2022 22:07:11 +0100
453aa9179Sopenharmony_ciSubject: [PATCH 23/28] parser: Restore parser state in xmlParseCDSect
553aa9179Sopenharmony_ci
653aa9179Sopenharmony_ciFixes #441.
753aa9179Sopenharmony_ci
853aa9179Sopenharmony_ciReference: https://github.com/GNOME/libxml2/commit/94ca36c2c48ad3857175ea66a373e51e67b98f00
953aa9179Sopenharmony_ciConflict: parser.c:<xmlParseCDSect>
1053aa9179Sopenharmony_ci---
1153aa9179Sopenharmony_ci parser.c | 25 +++++++++++--------------
1253aa9179Sopenharmony_ci 1 file changed, 11 insertions(+), 14 deletions(-)
1353aa9179Sopenharmony_ci
1453aa9179Sopenharmony_cidiff --git a/parser.c b/parser.c
1553aa9179Sopenharmony_ciindex 6e55838..4360479 100644
1653aa9179Sopenharmony_ci--- a/parser.c
1753aa9179Sopenharmony_ci+++ b/parser.c
1853aa9179Sopenharmony_ci@@ -9788,22 +9788,20 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
1953aa9179Sopenharmony_ci     r = CUR_CHAR(rl);
2053aa9179Sopenharmony_ci     if (!IS_CHAR(r)) {
2153aa9179Sopenharmony_ci 	xmlFatalErr(ctxt, XML_ERR_CDATA_NOT_FINISHED, NULL);
2253aa9179Sopenharmony_ci-	ctxt->instate = XML_PARSER_CONTENT;
2353aa9179Sopenharmony_ci-        return;
2453aa9179Sopenharmony_ci+        goto out;
2553aa9179Sopenharmony_ci     }
2653aa9179Sopenharmony_ci     NEXTL(rl);
2753aa9179Sopenharmony_ci     s = CUR_CHAR(sl);
2853aa9179Sopenharmony_ci     if (!IS_CHAR(s)) {
2953aa9179Sopenharmony_ci 	xmlFatalErr(ctxt, XML_ERR_CDATA_NOT_FINISHED, NULL);
3053aa9179Sopenharmony_ci-	ctxt->instate = XML_PARSER_CONTENT;
3153aa9179Sopenharmony_ci-        return;
3253aa9179Sopenharmony_ci+        goto out;
3353aa9179Sopenharmony_ci     }
3453aa9179Sopenharmony_ci     NEXTL(sl);
3553aa9179Sopenharmony_ci     cur = CUR_CHAR(l);
3653aa9179Sopenharmony_ci     buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar));
3753aa9179Sopenharmony_ci     if (buf == NULL) {
3853aa9179Sopenharmony_ci 	xmlErrMemory(ctxt, NULL);
3953aa9179Sopenharmony_ci-	return;
4053aa9179Sopenharmony_ci+	goto out;
4153aa9179Sopenharmony_ci     }
4253aa9179Sopenharmony_ci     while (IS_CHAR(cur) &&
4353aa9179Sopenharmony_ci            ((r != ']') || (s != ']') || (cur != '>'))) {
4453aa9179Sopenharmony_ci@@ -9812,9 +9810,8 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
4553aa9179Sopenharmony_ci 
4653aa9179Sopenharmony_ci 	    tmp = (xmlChar *) xmlRealloc(buf, size * 2 * sizeof(xmlChar));
4753aa9179Sopenharmony_ci 	    if (tmp == NULL) {
4853aa9179Sopenharmony_ci-	        xmlFree(buf);
4953aa9179Sopenharmony_ci 		xmlErrMemory(ctxt, NULL);
5053aa9179Sopenharmony_ci-		return;
5153aa9179Sopenharmony_ci+		goto out;
5253aa9179Sopenharmony_ci 	    }
5353aa9179Sopenharmony_ci 	    buf = tmp;
5453aa9179Sopenharmony_ci 	    size *= 2;
5553aa9179Sopenharmony_ci@@ -9829,8 +9826,7 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
5653aa9179Sopenharmony_ci 	    SHRINK;
5753aa9179Sopenharmony_ci 	    GROW;
5853aa9179Sopenharmony_ci             if (ctxt->instate == XML_PARSER_EOF) {
5953aa9179Sopenharmony_ci-		xmlFree(buf);
6053aa9179Sopenharmony_ci-		return;
6153aa9179Sopenharmony_ci+                goto out;
6253aa9179Sopenharmony_ci             }
6353aa9179Sopenharmony_ci 	    count = 0;
6453aa9179Sopenharmony_ci 	}
6553aa9179Sopenharmony_ci@@ -9839,17 +9835,14 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
6653aa9179Sopenharmony_ci         if (len > maxLength) {
6753aa9179Sopenharmony_ci             xmlFatalErrMsg(ctxt, XML_ERR_CDATA_NOT_FINISHED,
6853aa9179Sopenharmony_ci                            "CData section too big found\n");
6953aa9179Sopenharmony_ci-            xmlFree(buf);
7053aa9179Sopenharmony_ci-            return;
7153aa9179Sopenharmony_ci+            goto out;
7253aa9179Sopenharmony_ci         }
7353aa9179Sopenharmony_ci     }
7453aa9179Sopenharmony_ci     buf[len] = 0;
7553aa9179Sopenharmony_ci-    ctxt->instate = XML_PARSER_CONTENT;
7653aa9179Sopenharmony_ci     if (cur != '>') {
7753aa9179Sopenharmony_ci 	xmlFatalErrMsgStr(ctxt, XML_ERR_CDATA_NOT_FINISHED,
7853aa9179Sopenharmony_ci 	                     "CData section not finished\n%.50s\n", buf);
7953aa9179Sopenharmony_ci-	xmlFree(buf);
8053aa9179Sopenharmony_ci-        return;
8153aa9179Sopenharmony_ci+        goto out;
8253aa9179Sopenharmony_ci     }
8353aa9179Sopenharmony_ci     NEXTL(l);
8453aa9179Sopenharmony_ci 
8553aa9179Sopenharmony_ci@@ -9862,6 +9855,10 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
8653aa9179Sopenharmony_ci 	else if (ctxt->sax->characters != NULL)
8753aa9179Sopenharmony_ci 	    ctxt->sax->characters(ctxt->userData, buf, len);
8853aa9179Sopenharmony_ci     }
8953aa9179Sopenharmony_ci+
9053aa9179Sopenharmony_ci+out:
9153aa9179Sopenharmony_ci+    if (ctxt->instate != XML_PARSER_EOF)
9253aa9179Sopenharmony_ci+        ctxt->instate = XML_PARSER_CONTENT;
9353aa9179Sopenharmony_ci     xmlFree(buf);
9453aa9179Sopenharmony_ci }
9553aa9179Sopenharmony_ci 
9653aa9179Sopenharmony_ci-- 
9753aa9179Sopenharmony_ci2.27.0
9853aa9179Sopenharmony_ci
99