1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2024-10-26 12:25:09 +03:00

xinclude: Don't pass documents to xmlXIncludeCopyNode

Extract the root element directly in xmlXIncludeCopyXPointer.
This commit is contained in:
Nick Wellnhofer 2022-10-22 17:48:25 +02:00
parent 46e4cfb643
commit bc32c3862c

View File

@ -844,11 +844,9 @@ xmlXIncludeCopyNode(xmlXIncludeCtxtPtr ctxt, xmlNodePtr elem) {
if ((ctxt == NULL) || (elem == NULL))
return(NULL);
if (elem->type == XML_DTD_NODE)
if ((elem->type == XML_DOCUMENT_NODE) || (elem->type == XML_DTD_NODE))
return(NULL);
if (elem->type == XML_DOCUMENT_NODE)
result = xmlXIncludeCopyNodeList(ctxt, elem->children, NULL);
else if ((elem->type == XML_ELEMENT_NODE) &&
if ((elem->type == XML_ELEMENT_NODE) &&
(elem->ns != NULL) &&
(xmlStrEqual(elem->name, XINCLUDE_NODE)) &&
((xmlStrEqual(elem->ns->href, XINCLUDE_NS)) ||
@ -1167,30 +1165,34 @@ xmlXIncludeCopyXPointer(xmlXIncludeCtxtPtr ctxt, xmlXPathObjectPtr obj) {
if (set == NULL)
return(NULL);
for (i = 0;i < set->nodeNr;i++) {
xmlNodePtr node;
if (set->nodeTab[i] == NULL)
continue;
switch (set->nodeTab[i]->type) {
case XML_DOCUMENT_NODE:
case XML_HTML_DOCUMENT_NODE:
node = xmlDocGetRootElement(
(xmlDocPtr) set->nodeTab[i]);
if (node == NULL) {
xmlXIncludeErr(ctxt, set->nodeTab[i],
XML_ERR_INTERNAL_ERROR,
"document without root\n", NULL);
continue;
}
break;
case XML_TEXT_NODE:
case XML_CDATA_SECTION_NODE:
case XML_ELEMENT_NODE:
case XML_ENTITY_REF_NODE:
case XML_ENTITY_NODE:
case XML_PI_NODE:
case XML_COMMENT_NODE:
case XML_DOCUMENT_NODE:
case XML_HTML_DOCUMENT_NODE:
node = set->nodeTab[i];
break;
case XML_XINCLUDE_START:
case XML_XINCLUDE_END:
case XML_ATTRIBUTE_NODE:
case XML_NAMESPACE_DECL:
case XML_DOCUMENT_TYPE_NODE:
case XML_DOCUMENT_FRAG_NODE:
case XML_NOTATION_NODE:
case XML_DTD_NODE:
case XML_ELEMENT_DECL:
case XML_ATTRIBUTE_DECL:
case XML_ENTITY_DECL:
default:
xmlXIncludeErr(ctxt, set->nodeTab[i],
XML_XINCLUDE_XPTR_RESULT,
"invalid node type in XPtr result\n",
NULL);
continue; /* for */
}
/*
@ -1199,7 +1201,7 @@ xmlXIncludeCopyXPointer(xmlXIncludeCtxtPtr ctxt, xmlXPathObjectPtr obj) {
* xmlXIncludeCopyNode is only required for the initial
* document.
*/
copy = xmlXIncludeCopyNode(ctxt, set->nodeTab[i]);
copy = xmlXIncludeCopyNode(ctxt, node);
if (copy == NULL) {
xmlFreeNodeList(list);
return(NULL);