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