加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
backport-parser-Restore-parser-state-in-xmlParseCDSect.patch 2.61 KB
一键复制 编辑 原始数据 按行查看 历史
冉召宇 提交于 2024-04-25 19:13 . libxml2切openEuler7.0
From 003d0baef83a3c694fba6f194cfc8c14bc035082 Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <wellnhofer@aevum.de>
Date: Mon, 21 Nov 2022 22:07:11 +0100
Subject: [PATCH 23/28] parser: Restore parser state in xmlParseCDSect
Fixes #441.
Reference: https://github.com/GNOME/libxml2/commit/94ca36c2c48ad3857175ea66a373e51e67b98f00
Conflict: parser.c:<xmlParseCDSect>
---
parser.c | 25 +++++++++++--------------
1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/parser.c b/parser.c
index 6e55838..4360479 100644
--- a/parser.c
+++ b/parser.c
@@ -9788,22 +9788,20 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
r = CUR_CHAR(rl);
if (!IS_CHAR(r)) {
xmlFatalErr(ctxt, XML_ERR_CDATA_NOT_FINISHED, NULL);
- ctxt->instate = XML_PARSER_CONTENT;
- return;
+ goto out;
}
NEXTL(rl);
s = CUR_CHAR(sl);
if (!IS_CHAR(s)) {
xmlFatalErr(ctxt, XML_ERR_CDATA_NOT_FINISHED, NULL);
- ctxt->instate = XML_PARSER_CONTENT;
- return;
+ goto out;
}
NEXTL(sl);
cur = CUR_CHAR(l);
buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar));
if (buf == NULL) {
xmlErrMemory(ctxt, NULL);
- return;
+ goto out;
}
while (IS_CHAR(cur) &&
((r != ']') || (s != ']') || (cur != '>'))) {
@@ -9812,9 +9810,8 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
tmp = (xmlChar *) xmlRealloc(buf, size * 2 * sizeof(xmlChar));
if (tmp == NULL) {
- xmlFree(buf);
xmlErrMemory(ctxt, NULL);
- return;
+ goto out;
}
buf = tmp;
size *= 2;
@@ -9829,8 +9826,7 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
SHRINK;
GROW;
if (ctxt->instate == XML_PARSER_EOF) {
- xmlFree(buf);
- return;
+ goto out;
}
count = 0;
}
@@ -9839,17 +9835,14 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
if (len > maxLength) {
xmlFatalErrMsg(ctxt, XML_ERR_CDATA_NOT_FINISHED,
"CData section too big found\n");
- xmlFree(buf);
- return;
+ goto out;
}
}
buf[len] = 0;
- ctxt->instate = XML_PARSER_CONTENT;
if (cur != '>') {
xmlFatalErrMsgStr(ctxt, XML_ERR_CDATA_NOT_FINISHED,
"CData section not finished\n%.50s\n", buf);
- xmlFree(buf);
- return;
+ goto out;
}
NEXTL(l);
@@ -9862,6 +9855,10 @@ xmlParseCDSect(xmlParserCtxtPtr ctxt) {
else if (ctxt->sax->characters != NULL)
ctxt->sax->characters(ctxt->userData, buf, len);
}
+
+out:
+ if (ctxt->instate != XML_PARSER_EOF)
+ ctxt->instate = XML_PARSER_CONTENT;
xmlFree(buf);
}
--
2.27.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化