summaryrefslogtreecommitdiffstats
path: root/external/libxml2/libxml2-xpath.patch
diff options
context:
space:
mode:
Diffstat (limited to 'external/libxml2/libxml2-xpath.patch')
-rw-r--r--external/libxml2/libxml2-xpath.patch70
1 files changed, 70 insertions, 0 deletions
diff --git a/external/libxml2/libxml2-xpath.patch b/external/libxml2/libxml2-xpath.patch
new file mode 100644
index 000000000000..107de91ed862
--- /dev/null
+++ b/external/libxml2/libxml2-xpath.patch
@@ -0,0 +1,70 @@
+--- misc/libxml2-2.7.6/xpath.c 2009-09-24 17:32:00.000000000 +0200
++++ misc/build/libxml2-2.7.6/xpath.c 2011-01-03 17:21:08.788256100 +0100
+@@ -8106,9 +8106,17 @@
+ xmlNodePtr
+ xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
+ if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
+- if (cur != NULL && cur->children != NULL)
+- return cur->children ;
+- if (cur == NULL) cur = ctxt->context->node;
++ if ((cur != NULL) && (cur->type != XML_ATTRIBUTE_NODE) &&
++ (cur->type != XML_NAMESPACE_DECL) && (cur->children != NULL))
++ return(cur->children);
++
++ if (cur == NULL) {
++ cur = ctxt->context->node;
++ if (cur->type == XML_NAMESPACE_DECL)
++ return(NULL);
++ if (cur->type == XML_ATTRIBUTE_NODE)
++ cur = cur->parent;
++ }
+ if (cur == NULL) return(NULL) ; /* ERROR */
+ if (cur->next != NULL) return(cur->next) ;
+ do {
+@@ -8162,8 +8170,13 @@
+ xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt, xmlNodePtr cur)
+ {
+ if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
+- if (cur == NULL)
++ if (cur == NULL) {
+ cur = ctxt->context->node;
++ if (cur->type == XML_NAMESPACE_DECL)
++ return(NULL);
++ if (cur->type == XML_ATTRIBUTE_NODE)
++ return(cur->parent);
++ }
+ if (cur == NULL)
+ return (NULL);
+ if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE))
+@@ -8207,8 +8220,8 @@
+ cur = ctxt->context->node;
+ if (cur == NULL)
+ return (NULL);
+- if (cur->type == XML_NAMESPACE_DECL)
+- cur = (xmlNodePtr)((xmlNsPtr)cur)->next;
++ if (cur->type == XML_NAMESPACE_DECL)
++ return (NULL);
+ ctxt->ancestor = cur->parent;
+ }
+ if ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE))
+@@ -11737,11 +11750,16 @@
+
+ if ((ctxt->error != XPATH_EXPRESSION_OK) || (res == -1)) {
+ xmlXPathObjectPtr tmp;
+- /* pop the result */
++ /* pop the result if any */
+ tmp = valuePop(ctxt);
+- xmlXPathReleaseObject(xpctxt, tmp);
+- /* then pop off contextObj, which will be freed later */
+- valuePop(ctxt);
++ if (tmp != contextObj) {
++ /*
++ * Free up the result
++ * then pop off contextObj, which will be freed later
++ */
++ xmlXPathReleaseObject(xpctxt, tmp);
++ valuePop(ctxt);
++ }
+ goto evaluation_error;
+ }
+