1 Star 0 Fork 53

冉召宇/third_party_libxml2_1

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
backport-parser-Fix-regression-in-xmlParserNodeInfo-accountin.patch 5.47 KB
一键复制 编辑 原始数据 按行查看 历史
冉召宇 提交于 2024-04-25 19:13 +08:00 . libxml2切openEuler7.0
From 250faf3c832d998baa559ca1a1c61935235aba20 Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <wellnhofer@aevum.de>
Date: Thu, 20 Apr 2023 12:35:21 +0200
Subject: [PATCH] parser: Fix regression in xmlParserNodeInfo accounting
Commit 62150ed2 broke begin_pos and begin_line when extra node info was
recorded.
Fixes #523.
Reference:https://github.com/GNOME/libxml2/commit/250faf3c832d998baa559ca1a1c61935235aba20
Conflict:NA
---
SAX2.c | 20 ++------------------
parser.c | 53 +++++++++++++++++++++++++----------------------------
2 files changed, 27 insertions(+), 46 deletions(-)
diff --git a/SAX2.c b/SAX2.c
index 916e974..822b975 100644
--- a/SAX2.c
+++ b/SAX2.c
@@ -1783,13 +1783,6 @@ xmlSAX2EndElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED)
xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(%s)\n", name);
#endif
- /* Capture end position and add node */
- if (cur != NULL && ctxt->record_info) {
- ctxt->nodeInfo->end_pos = ctxt->input->cur - ctxt->input->base;
- ctxt->nodeInfo->end_line = ctxt->input->line;
- ctxt->nodeInfo->node = cur;
- xmlParserAddNodeInfo(ctxt, ctxt->nodeInfo);
- }
ctxt->nodemem = -1;
#ifdef LIBXML_VALID_ENABLED
@@ -2433,24 +2426,15 @@ xmlSAX2EndElementNs(void *ctx,
const xmlChar * URI ATTRIBUTE_UNUSED)
{
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
- xmlParserNodeInfo node_info;
- xmlNodePtr cur;
if (ctx == NULL) return;
- cur = ctxt->node;
- /* Capture end position and add node */
- if ((ctxt->record_info) && (cur != NULL)) {
- node_info.end_pos = ctxt->input->cur - ctxt->input->base;
- node_info.end_line = ctxt->input->line;
- node_info.node = cur;
- xmlParserAddNodeInfo(ctxt, &node_info);
- }
ctxt->nodemem = -1;
#ifdef LIBXML_VALID_ENABLED
if (ctxt->validate && ctxt->wellFormed &&
ctxt->myDoc && ctxt->myDoc->intSubset)
- ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, cur);
+ ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc,
+ ctxt->node);
#endif /* LIBXML_VALID_ENABLED */
/*
diff --git a/parser.c b/parser.c
index a4c9fb2..94a6298 100644
--- a/parser.c
+++ b/parser.c
@@ -10025,7 +10025,7 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
const xmlChar *URI = NULL;
xmlParserNodeInfo node_info;
int line, tlen = 0;
- xmlNodePtr ret;
+ xmlNodePtr cur;
int nsNr = ctxt->nsNr;
if (((unsigned int) ctxt->nameNr > xmlParserMaxDepth) &&
@@ -10067,7 +10067,7 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
return(-1);
}
nameNsPush(ctxt, name, prefix, URI, line, ctxt->nsNr - nsNr);
- ret = ctxt->node;
+ cur = ctxt->node;
#ifdef LIBXML_VALID_ENABLED
/*
@@ -10100,17 +10100,23 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
spacePop(ctxt);
if (nsNr != ctxt->nsNr)
nsPop(ctxt, ctxt->nsNr - nsNr);
- if ( ret != NULL && ctxt->record_info ) {
- node_info.end_pos = ctxt->input->consumed +
- (CUR_PTR - ctxt->input->base);
- node_info.end_line = ctxt->input->line;
- node_info.node = ret;
- xmlParserAddNodeInfo(ctxt, &node_info);
+ if (cur != NULL && ctxt->record_info) {
+ node_info.node = cur;
+ node_info.end_pos = ctxt->input->consumed +
+ (CUR_PTR - ctxt->input->base);
+ node_info.end_line = ctxt->input->line;
+ xmlParserAddNodeInfo(ctxt, &node_info);
}
return(1);
}
if (RAW == '>') {
NEXT1;
+ if (cur != NULL && ctxt->record_info) {
+ node_info.node = cur;
+ node_info.end_pos = 0;
+ node_info.end_line = 0;
+ xmlParserAddNodeInfo(ctxt, &node_info);
+ }
} else {
xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_GT_REQUIRED,
"Couldn't find end of Start Tag %s line %d\n",
@@ -10124,17 +10130,6 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
spacePop(ctxt);
if (nsNr != ctxt->nsNr)
nsPop(ctxt, ctxt->nsNr - nsNr);
-
- /*
- * Capture end position and add node
- */
- if ( ret != NULL && ctxt->record_info ) {
- node_info.end_pos = ctxt->input->consumed +
- (CUR_PTR - ctxt->input->base);
- node_info.end_line = ctxt->input->line;
- node_info.node = ret;
- xmlParserAddNodeInfo(ctxt, &node_info);
- }
return(-1);
}
@@ -10149,8 +10144,7 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
*/
static void
xmlParseElementEnd(xmlParserCtxtPtr ctxt) {
- xmlParserNodeInfo node_info;
- xmlNodePtr ret = ctxt->node;
+ xmlNodePtr cur = ctxt->node;
if (ctxt->nameNr <= 0)
return;
@@ -10168,14 +10162,17 @@ xmlParseElementEnd(xmlParserCtxtPtr ctxt) {
#endif /* LIBXML_SAX1_ENABLED */
/*
- * Capture end position and add node
+ * Capture end position
*/
- if ( ret != NULL && ctxt->record_info ) {
- node_info.end_pos = ctxt->input->consumed +
- (CUR_PTR - ctxt->input->base);
- node_info.end_line = ctxt->input->line;
- node_info.node = ret;
- xmlParserAddNodeInfo(ctxt, &node_info);
+ if (cur != NULL && ctxt->record_info) {
+ xmlParserNodeInfoPtr node_info;
+
+ node_info = (xmlParserNodeInfoPtr) xmlParserFindNodeInfo(ctxt, cur);
+ if (node_info != NULL) {
+ node_info->end_pos = ctxt->input->consumed +
+ (CUR_PTR - ctxt->input->base);
+ node_info->end_line = ctxt->input->line;
+ }
}
}
--
2.27.0
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/ran-zhao-yu/third_party_libxml2_1.git
git@gitee.com:ran-zhao-yu/third_party_libxml2_1.git
ran-zhao-yu
third_party_libxml2_1
third_party_libxml2_1
master

搜索帮助