mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-02-05 05:47:00 +03:00
- 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
This commit is contained in:
parent
3739b98927
commit
39196eba17
@ -1,3 +1,9 @@
|
||||
Tue Jun 19 20:03:40 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
|
||||
|
||||
* 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.
|
||||
|
||||
Tue Jun 19 14:50:18 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
|
||||
|
||||
* Makefile.am: Kjartan Maraas provided a small patch to
|
||||
|
32
tree.c
32
tree.c
@ -2700,6 +2700,38 @@ xmlStaticCopyNode(xmlNodePtr node, xmlDocPtr doc, xmlNodePtr parent,
|
||||
xmlNodePtr ret;
|
||||
|
||||
if (node == NULL) return(NULL);
|
||||
switch (node->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
|
||||
case XML_XINCLUDE_START:
|
||||
case XML_XINCLUDE_END:
|
||||
break;
|
||||
case XML_ATTRIBUTE_NODE:
|
||||
return((xmlNodePtr)
|
||||
xmlCopyProp(parent, (xmlAttrPtr) node));
|
||||
case XML_NAMESPACE_DECL:
|
||||
return((xmlNodePtr)
|
||||
xmlCopyNamespaceList((xmlNsPtr) node));
|
||||
|
||||
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:
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate a new node and fill the fields.
|
||||
|
70
xinclude.c
70
xinclude.c
@ -434,6 +434,7 @@ loaded:
|
||||
*/
|
||||
xmlXPathObjectPtr xptr;
|
||||
xmlXPathContextPtr xptrctxt;
|
||||
xmlNodeSetPtr set;
|
||||
|
||||
if (doc == NULL) {
|
||||
xptrctxt = xmlXPtrNewContext(ctxt->doc, ctxt->incTab[nr], NULL);
|
||||
@ -457,6 +458,75 @@ loaded:
|
||||
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);
|
||||
|
30
xpointer.c
30
xpointer.c
@ -1503,6 +1503,7 @@ xmlXPtrBuildRangeNodeList(xmlXPathObjectPtr range) {
|
||||
* @obj: the XPointer result from the evaluation.
|
||||
*
|
||||
* Build a node list tree copy of the XPointer result.
|
||||
* This will drop Attributes and Namespace declarations.
|
||||
*
|
||||
* Returns an xmlNodePtr list or NULL.
|
||||
* the caller has to free the node tree.
|
||||
@ -1520,6 +1521,35 @@ xmlXPtrBuildNodeList(xmlXPathObjectPtr obj) {
|
||||
if (set == NULL)
|
||||
return(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
|
||||
case XML_XINCLUDE_START:
|
||||
case XML_XINCLUDE_END:
|
||||
break;
|
||||
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:
|
||||
continue; /* for */
|
||||
}
|
||||
if (last == NULL)
|
||||
list = last = xmlCopyNode(set->nodeTab[i], 1);
|
||||
else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user