- tree.c xinclude.c xpointer.c: bug #56402 exposed a number of
weakness in the node copy the XPointer and the XInclude
implementations. Serious cleanup.
Daniel
diff --git a/xinclude.c b/xinclude.c
index 0909d3e..b659b44 100644
--- a/xinclude.c
+++ b/xinclude.c
@@ -434,6 +434,7 @@
*/
xmlXPathObjectPtr xptr;
xmlXPathContextPtr xptrctxt;
+ xmlNodeSetPtr set;
if (doc == NULL) {
xptrctxt = xmlXPtrNewContext(ctxt->doc, ctxt->incTab[nr], NULL);
@@ -457,6 +458,75 @@
xmlFree(fragment);
return;
}
+ switch (xptr->type) {
+ case XPATH_UNDEFINED:
+ case XPATH_BOOLEAN:
+ case XPATH_NUMBER:
+ case XPATH_STRING:
+ case XPATH_POINT:
+ case XPATH_USERS:
+ case XPATH_XSLT_TREE:
+ xmlGenericError(xmlGenericErrorContext,
+ "XInclude: XPointer is not a range: #%s\n",
+ fragment);
+ xmlXPathFreeContext(xptrctxt);
+ xmlFree(URL);
+ xmlFree(fragment);
+ return;
+ case XPATH_NODESET:
+ case XPATH_RANGE:
+ case XPATH_LOCATIONSET:
+ break;
+ }
+ set = xptr->nodesetval;
+ if (set != NULL) {
+ for (i = 0;i < set->nodeNr;i++) {
+ if (set->nodeTab[i] == NULL)
+ continue;
+ switch (set->nodeTab[i]->type) {
+ 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:
+#ifdef LIBXML_DOCB_ENABLED
+ case XML_DOCB_DOCUMENT_NODE:
+#endif
+ continue;
+ case XML_ATTRIBUTE_NODE:
+ xmlGenericError(xmlGenericErrorContext,
+ "XInclude: XPointer selects an attribute: #%s\n",
+ fragment);
+ set->nodeTab[i] = NULL;
+ continue;
+ case XML_NAMESPACE_DECL:
+ xmlGenericError(xmlGenericErrorContext,
+ "XInclude: XPointer selects a namespace: #%s\n",
+ fragment);
+ set->nodeTab[i] = NULL;
+ continue;
+ 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:
+ case XML_XINCLUDE_START:
+ case XML_XINCLUDE_END:
+ xmlGenericError(xmlGenericErrorContext,
+ "XInclude: XPointer selects unexpected nodes: #%s\n",
+ fragment);
+ set->nodeTab[i] = NULL;
+ set->nodeTab[i] = NULL;
+ continue; /* for */
+ }
+ }
+ }
ctxt->repTab[nr] = xmlXPtrBuildNodeList(xptr);
xmlXPathFreeObject(xptr);
xmlXPathFreeContext(xptrctxt);