2011-01-03 10:59:57 -06:00
|
|
|
--- 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 @@
|
2010-12-06 09:16:57 -06:00
|
|
|
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 {
|
2011-01-03 10:59:57 -06:00
|
|
|
@@ -8162,8 +8170,13 @@
|
2010-12-06 09:16:57 -06:00
|
|
|
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))
|
2011-01-03 10:59:57 -06:00
|
|
|
@@ -8207,8 +8220,8 @@
|
2010-12-06 09:16:57 -06:00
|
|
|
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))
|
2011-01-03 10:59:57 -06:00
|
|
|
@@ -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;
|
|
|
|
}
|
|
|
|
|