153aa9179Sopenharmony_ciFrom 250faf3c832d998baa559ca1a1c61935235aba20 Mon Sep 17 00:00:00 2001
253aa9179Sopenharmony_ciFrom: Nick Wellnhofer <wellnhofer@aevum.de>
353aa9179Sopenharmony_ciDate: Thu, 20 Apr 2023 12:35:21 +0200
453aa9179Sopenharmony_ciSubject: [PATCH] parser: Fix regression in xmlParserNodeInfo accounting
553aa9179Sopenharmony_ci
653aa9179Sopenharmony_ciCommit 62150ed2 broke begin_pos and begin_line when extra node info was
753aa9179Sopenharmony_cirecorded.
853aa9179Sopenharmony_ci
953aa9179Sopenharmony_ciFixes #523.
1053aa9179Sopenharmony_ci
1153aa9179Sopenharmony_ciReference:https://github.com/GNOME/libxml2/commit/250faf3c832d998baa559ca1a1c61935235aba20
1253aa9179Sopenharmony_ciConflict:NA
1353aa9179Sopenharmony_ci
1453aa9179Sopenharmony_ci---
1553aa9179Sopenharmony_ci SAX2.c   | 20 ++------------------
1653aa9179Sopenharmony_ci parser.c | 53 +++++++++++++++++++++++++----------------------------
1753aa9179Sopenharmony_ci 2 files changed, 27 insertions(+), 46 deletions(-)
1853aa9179Sopenharmony_ci
1953aa9179Sopenharmony_cidiff --git a/SAX2.c b/SAX2.c
2053aa9179Sopenharmony_ciindex 916e974..822b975 100644
2153aa9179Sopenharmony_ci--- a/SAX2.c
2253aa9179Sopenharmony_ci+++ b/SAX2.c
2353aa9179Sopenharmony_ci@@ -1783,13 +1783,6 @@ xmlSAX2EndElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED)
2453aa9179Sopenharmony_ci 	xmlGenericError(xmlGenericErrorContext, "SAX.xmlSAX2EndElement(%s)\n", name);
2553aa9179Sopenharmony_ci #endif
2653aa9179Sopenharmony_ci 
2753aa9179Sopenharmony_ci-    /* Capture end position and add node */
2853aa9179Sopenharmony_ci-    if (cur != NULL && ctxt->record_info) {
2953aa9179Sopenharmony_ci-      ctxt->nodeInfo->end_pos = ctxt->input->cur - ctxt->input->base;
3053aa9179Sopenharmony_ci-      ctxt->nodeInfo->end_line = ctxt->input->line;
3153aa9179Sopenharmony_ci-      ctxt->nodeInfo->node = cur;
3253aa9179Sopenharmony_ci-      xmlParserAddNodeInfo(ctxt, ctxt->nodeInfo);
3353aa9179Sopenharmony_ci-    }
3453aa9179Sopenharmony_ci     ctxt->nodemem = -1;
3553aa9179Sopenharmony_ci 
3653aa9179Sopenharmony_ci #ifdef LIBXML_VALID_ENABLED
3753aa9179Sopenharmony_ci@@ -2433,24 +2426,15 @@ xmlSAX2EndElementNs(void *ctx,
3853aa9179Sopenharmony_ci 		    const xmlChar * URI ATTRIBUTE_UNUSED)
3953aa9179Sopenharmony_ci {
4053aa9179Sopenharmony_ci     xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
4153aa9179Sopenharmony_ci-    xmlParserNodeInfo node_info;
4253aa9179Sopenharmony_ci-    xmlNodePtr cur;
4353aa9179Sopenharmony_ci 
4453aa9179Sopenharmony_ci     if (ctx == NULL) return;
4553aa9179Sopenharmony_ci-    cur = ctxt->node;
4653aa9179Sopenharmony_ci-    /* Capture end position and add node */
4753aa9179Sopenharmony_ci-    if ((ctxt->record_info) && (cur != NULL)) {
4853aa9179Sopenharmony_ci-        node_info.end_pos = ctxt->input->cur - ctxt->input->base;
4953aa9179Sopenharmony_ci-        node_info.end_line = ctxt->input->line;
5053aa9179Sopenharmony_ci-        node_info.node = cur;
5153aa9179Sopenharmony_ci-        xmlParserAddNodeInfo(ctxt, &node_info);
5253aa9179Sopenharmony_ci-    }
5353aa9179Sopenharmony_ci     ctxt->nodemem = -1;
5453aa9179Sopenharmony_ci 
5553aa9179Sopenharmony_ci #ifdef LIBXML_VALID_ENABLED
5653aa9179Sopenharmony_ci     if (ctxt->validate && ctxt->wellFormed &&
5753aa9179Sopenharmony_ci         ctxt->myDoc && ctxt->myDoc->intSubset)
5853aa9179Sopenharmony_ci-        ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, cur);
5953aa9179Sopenharmony_ci+        ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc,
6053aa9179Sopenharmony_ci+                                             ctxt->node);
6153aa9179Sopenharmony_ci #endif /* LIBXML_VALID_ENABLED */
6253aa9179Sopenharmony_ci 
6353aa9179Sopenharmony_ci     /*
6453aa9179Sopenharmony_cidiff --git a/parser.c b/parser.c
6553aa9179Sopenharmony_ciindex a4c9fb2..94a6298 100644
6653aa9179Sopenharmony_ci--- a/parser.c
6753aa9179Sopenharmony_ci+++ b/parser.c
6853aa9179Sopenharmony_ci@@ -10025,7 +10025,7 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
6953aa9179Sopenharmony_ci     const xmlChar *URI = NULL;
7053aa9179Sopenharmony_ci     xmlParserNodeInfo node_info;
7153aa9179Sopenharmony_ci     int line, tlen = 0;
7253aa9179Sopenharmony_ci-    xmlNodePtr ret;
7353aa9179Sopenharmony_ci+    xmlNodePtr cur;
7453aa9179Sopenharmony_ci     int nsNr = ctxt->nsNr;
7553aa9179Sopenharmony_ci 
7653aa9179Sopenharmony_ci     if (((unsigned int) ctxt->nameNr > xmlParserMaxDepth) &&
7753aa9179Sopenharmony_ci@@ -10067,7 +10067,7 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
7853aa9179Sopenharmony_ci         return(-1);
7953aa9179Sopenharmony_ci     }
8053aa9179Sopenharmony_ci     nameNsPush(ctxt, name, prefix, URI, line, ctxt->nsNr - nsNr);
8153aa9179Sopenharmony_ci-    ret = ctxt->node;
8253aa9179Sopenharmony_ci+    cur = ctxt->node;
8353aa9179Sopenharmony_ci 
8453aa9179Sopenharmony_ci #ifdef LIBXML_VALID_ENABLED
8553aa9179Sopenharmony_ci     /*
8653aa9179Sopenharmony_ci@@ -10100,17 +10100,23 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
8753aa9179Sopenharmony_ci 	spacePop(ctxt);
8853aa9179Sopenharmony_ci 	if (nsNr != ctxt->nsNr)
8953aa9179Sopenharmony_ci 	    nsPop(ctxt, ctxt->nsNr - nsNr);
9053aa9179Sopenharmony_ci-	if ( ret != NULL && ctxt->record_info ) {
9153aa9179Sopenharmony_ci-	   node_info.end_pos = ctxt->input->consumed +
9253aa9179Sopenharmony_ci-			      (CUR_PTR - ctxt->input->base);
9353aa9179Sopenharmony_ci-	   node_info.end_line = ctxt->input->line;
9453aa9179Sopenharmony_ci-	   node_info.node = ret;
9553aa9179Sopenharmony_ci-	   xmlParserAddNodeInfo(ctxt, &node_info);
9653aa9179Sopenharmony_ci+	if (cur != NULL && ctxt->record_info) {
9753aa9179Sopenharmony_ci+            node_info.node = cur;
9853aa9179Sopenharmony_ci+            node_info.end_pos = ctxt->input->consumed +
9953aa9179Sopenharmony_ci+                                (CUR_PTR - ctxt->input->base);
10053aa9179Sopenharmony_ci+            node_info.end_line = ctxt->input->line;
10153aa9179Sopenharmony_ci+            xmlParserAddNodeInfo(ctxt, &node_info);
10253aa9179Sopenharmony_ci 	}
10353aa9179Sopenharmony_ci 	return(1);
10453aa9179Sopenharmony_ci     }
10553aa9179Sopenharmony_ci     if (RAW == '>') {
10653aa9179Sopenharmony_ci         NEXT1;
10753aa9179Sopenharmony_ci+        if (cur != NULL && ctxt->record_info) {
10853aa9179Sopenharmony_ci+            node_info.node = cur;
10953aa9179Sopenharmony_ci+            node_info.end_pos = 0;
11053aa9179Sopenharmony_ci+            node_info.end_line = 0;
11153aa9179Sopenharmony_ci+            xmlParserAddNodeInfo(ctxt, &node_info);
11253aa9179Sopenharmony_ci+        }
11353aa9179Sopenharmony_ci     } else {
11453aa9179Sopenharmony_ci         xmlFatalErrMsgStrIntStr(ctxt, XML_ERR_GT_REQUIRED,
11553aa9179Sopenharmony_ci 		     "Couldn't find end of Start Tag %s line %d\n",
11653aa9179Sopenharmony_ci@@ -10124,17 +10130,6 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
11753aa9179Sopenharmony_ci 	spacePop(ctxt);
11853aa9179Sopenharmony_ci 	if (nsNr != ctxt->nsNr)
11953aa9179Sopenharmony_ci 	    nsPop(ctxt, ctxt->nsNr - nsNr);
12053aa9179Sopenharmony_ci-
12153aa9179Sopenharmony_ci-	/*
12253aa9179Sopenharmony_ci-	 * Capture end position and add node
12353aa9179Sopenharmony_ci-	 */
12453aa9179Sopenharmony_ci-	if ( ret != NULL && ctxt->record_info ) {
12553aa9179Sopenharmony_ci-	   node_info.end_pos = ctxt->input->consumed +
12653aa9179Sopenharmony_ci-			      (CUR_PTR - ctxt->input->base);
12753aa9179Sopenharmony_ci-	   node_info.end_line = ctxt->input->line;
12853aa9179Sopenharmony_ci-	   node_info.node = ret;
12953aa9179Sopenharmony_ci-	   xmlParserAddNodeInfo(ctxt, &node_info);
13053aa9179Sopenharmony_ci-	}
13153aa9179Sopenharmony_ci 	return(-1);
13253aa9179Sopenharmony_ci     }
13353aa9179Sopenharmony_ci 
13453aa9179Sopenharmony_ci@@ -10149,8 +10144,7 @@ xmlParseElementStart(xmlParserCtxtPtr ctxt) {
13553aa9179Sopenharmony_ci  */
13653aa9179Sopenharmony_ci static void
13753aa9179Sopenharmony_ci xmlParseElementEnd(xmlParserCtxtPtr ctxt) {
13853aa9179Sopenharmony_ci-    xmlParserNodeInfo node_info;
13953aa9179Sopenharmony_ci-    xmlNodePtr ret = ctxt->node;
14053aa9179Sopenharmony_ci+    xmlNodePtr cur = ctxt->node;
14153aa9179Sopenharmony_ci 
14253aa9179Sopenharmony_ci     if (ctxt->nameNr <= 0)
14353aa9179Sopenharmony_ci         return;
14453aa9179Sopenharmony_ci@@ -10168,14 +10162,17 @@ xmlParseElementEnd(xmlParserCtxtPtr ctxt) {
14553aa9179Sopenharmony_ci #endif /* LIBXML_SAX1_ENABLED */
14653aa9179Sopenharmony_ci 
14753aa9179Sopenharmony_ci     /*
14853aa9179Sopenharmony_ci-     * Capture end position and add node
14953aa9179Sopenharmony_ci+     * Capture end position
15053aa9179Sopenharmony_ci      */
15153aa9179Sopenharmony_ci-    if ( ret != NULL && ctxt->record_info ) {
15253aa9179Sopenharmony_ci-       node_info.end_pos = ctxt->input->consumed +
15353aa9179Sopenharmony_ci-                          (CUR_PTR - ctxt->input->base);
15453aa9179Sopenharmony_ci-       node_info.end_line = ctxt->input->line;
15553aa9179Sopenharmony_ci-       node_info.node = ret;
15653aa9179Sopenharmony_ci-       xmlParserAddNodeInfo(ctxt, &node_info);
15753aa9179Sopenharmony_ci+    if (cur != NULL && ctxt->record_info) {
15853aa9179Sopenharmony_ci+        xmlParserNodeInfoPtr node_info;
15953aa9179Sopenharmony_ci+
16053aa9179Sopenharmony_ci+        node_info = (xmlParserNodeInfoPtr) xmlParserFindNodeInfo(ctxt, cur);
16153aa9179Sopenharmony_ci+        if (node_info != NULL) {
16253aa9179Sopenharmony_ci+            node_info->end_pos = ctxt->input->consumed +
16353aa9179Sopenharmony_ci+                                 (CUR_PTR - ctxt->input->base);
16453aa9179Sopenharmony_ci+            node_info->end_line = ctxt->input->line;
16553aa9179Sopenharmony_ci+        }
16653aa9179Sopenharmony_ci     }
16753aa9179Sopenharmony_ci }
16853aa9179Sopenharmony_ci 
16953aa9179Sopenharmony_ci-- 
17053aa9179Sopenharmony_ci2.27.0
17153aa9179Sopenharmony_ci
172