172 lines
5.5 KiB
Diff
172 lines
5.5 KiB
Diff
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
|
|
|