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