| --- 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; |
| } |
| |