1
0
mirror of https://github.com/GNOME/libxml2.git synced 2025-05-09 21:31:17 +08:00

xinclude: Fix memory leak with namespace nodes

Abort instead of setting nodeset elements to NULL. Fixes leak of
namespace nodes and avoids extraneous error messages.
This commit is contained in:
Nick Wellnhofer 2025-04-03 11:59:22 +02:00
parent eb0c98ebd0
commit def3674c58

View File

@ -1285,7 +1285,7 @@ loaded:
set = xptr->nodesetval; set = xptr->nodesetval;
if (set != NULL) { if (set != NULL) {
for (i = 0;i < set->nodeNr;i++) { for (i = 0;i < set->nodeNr;i++) {
if (set->nodeTab[i] == NULL) if (set->nodeTab[i] == NULL) /* shouldn't happen */
continue; continue;
switch (set->nodeTab[i]->type) { switch (set->nodeTab[i]->type) {
case XML_ELEMENT_NODE: case XML_ELEMENT_NODE:
@ -1304,15 +1304,13 @@ loaded:
XML_XINCLUDE_XPTR_RESULT, XML_XINCLUDE_XPTR_RESULT,
"XPointer selects an attribute: #%s\n", "XPointer selects an attribute: #%s\n",
fragment); fragment);
set->nodeTab[i] = NULL; goto xptr_error;
continue;
case XML_NAMESPACE_DECL: case XML_NAMESPACE_DECL:
xmlXIncludeErr(ctxt, ref->elem, xmlXIncludeErr(ctxt, ref->elem,
XML_XINCLUDE_XPTR_RESULT, XML_XINCLUDE_XPTR_RESULT,
"XPointer selects a namespace: #%s\n", "XPointer selects a namespace: #%s\n",
fragment); fragment);
set->nodeTab[i] = NULL; goto xptr_error;
continue;
case XML_DOCUMENT_TYPE_NODE: case XML_DOCUMENT_TYPE_NODE:
case XML_DOCUMENT_FRAG_NODE: case XML_DOCUMENT_FRAG_NODE:
case XML_NOTATION_NODE: case XML_NOTATION_NODE:
@ -1322,17 +1320,17 @@ loaded:
case XML_ENTITY_DECL: case XML_ENTITY_DECL:
case XML_XINCLUDE_START: case XML_XINCLUDE_START:
case XML_XINCLUDE_END: case XML_XINCLUDE_END:
/* shouldn't happen */
xmlXIncludeErr(ctxt, ref->elem, xmlXIncludeErr(ctxt, ref->elem,
XML_XINCLUDE_XPTR_RESULT, XML_XINCLUDE_XPTR_RESULT,
"XPointer selects unexpected nodes: #%s\n", "XPointer selects unexpected nodes: #%s\n",
fragment); fragment);
set->nodeTab[i] = NULL; goto xptr_error;
set->nodeTab[i] = NULL;
continue; /* for */
} }
} }
} }
ref->inc = xmlXIncludeCopyXPointer(ctxt, xptr, ref->base); ref->inc = xmlXIncludeCopyXPointer(ctxt, xptr, ref->base);
xptr_error:
xmlXPathFreeObject(xptr); xmlXPathFreeObject(xptr);
} }