From de1fca613ed3a8ab57bb3c83ff71538bd8b347d0 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Fri, 3 Oct 2014 17:57:46 +0200 Subject: [PATCH] Fix for compiled XPath helpers The helper functions added in commit c618db4 didn't restore context size and position. Unfortunately, xmlXPathCompiledEval changes these values in some rare cases. --- libxslt/transform.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libxslt/transform.c b/libxslt/transform.c index 07b4e5cf..24f9eb2c 100644 --- a/libxslt/transform.c +++ b/libxslt/transform.c @@ -353,10 +353,12 @@ xsltPreCompEval(xsltTransformContextPtr ctxt, xmlNodePtr node, xmlXPathContextPtr xpctxt; xmlNodePtr oldXPContextNode; xmlNsPtr *oldXPNamespaces; - int oldXPNsNr; + int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; xpctxt = ctxt->xpathCtxt; oldXPContextNode = xpctxt->node; + oldXPProximityPosition = xpctxt->proximityPosition; + oldXPContextSize = xpctxt->contextSize; oldXPNsNr = xpctxt->nsNr; oldXPNamespaces = xpctxt->namespaces; @@ -377,6 +379,8 @@ xsltPreCompEval(xsltTransformContextPtr ctxt, xmlNodePtr node, res = xmlXPathCompiledEval(comp->comp, xpctxt); xpctxt->node = oldXPContextNode; + xpctxt->proximityPosition = oldXPProximityPosition; + xpctxt->contextSize = oldXPContextSize; xpctxt->nsNr = oldXPNsNr; xpctxt->namespaces = oldXPNamespaces; @@ -398,10 +402,12 @@ xsltPreCompEvalToBoolean(xsltTransformContextPtr ctxt, xmlNodePtr node, xmlXPathContextPtr xpctxt; xmlNodePtr oldXPContextNode; xmlNsPtr *oldXPNamespaces; - int oldXPNsNr; + int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; xpctxt = ctxt->xpathCtxt; oldXPContextNode = xpctxt->node; + oldXPProximityPosition = xpctxt->proximityPosition; + oldXPContextSize = xpctxt->contextSize; oldXPNsNr = xpctxt->nsNr; oldXPNamespaces = xpctxt->namespaces; @@ -422,6 +428,8 @@ xsltPreCompEvalToBoolean(xsltTransformContextPtr ctxt, xmlNodePtr node, res = xmlXPathCompiledEvalToBoolean(comp->comp, xpctxt); xpctxt->node = oldXPContextNode; + xpctxt->proximityPosition = oldXPProximityPosition; + xpctxt->contextSize = oldXPContextSize; xpctxt->nsNr = oldXPNsNr; xpctxt->namespaces = oldXPNamespaces;