mirror of
https://gitlab.gnome.org/GNOME/libxslt
synced 2025-08-08 21:42:07 +03:00
Detect infinite recursion when evaluating function arguments
This fixes a regression introduced when consolidating recursion checks
in commit 1c8e0e5
. When a function is called recursively during
evaluation of its arguments, the recursion check in
xsltApplySequenceConstructor is never reached. Readd recursion check
in exsltFuncFunctionFunction but use the template depth counter.
Fixes bug #777293:
https://bugzilla.gnome.org/show_bug.cgi?id=777293
This commit is contained in:
@@ -331,6 +331,21 @@ exsltFuncFunctionFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When a function is called recursively during evaluation of its
|
||||||
|
* arguments, the recursion check in xsltApplySequenceConstructor
|
||||||
|
* isn't reached.
|
||||||
|
*/
|
||||||
|
if (tctxt->depth >= tctxt->maxTemplateDepth) {
|
||||||
|
xsltTransformError(tctxt, NULL, NULL,
|
||||||
|
"exsltFuncFunctionFunction: Potentially infinite recursion "
|
||||||
|
"detected in function {%s}%s.\n",
|
||||||
|
ctxt->context->functionURI, ctxt->context->function);
|
||||||
|
tctxt->state = XSLT_STATE_STOPPED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tctxt->depth++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have a problem with the evaluation of function parameters.
|
* We have a problem with the evaluation of function parameters.
|
||||||
* The original library code did not evaluate XPath expressions until
|
* The original library code did not evaluate XPath expressions until
|
||||||
@@ -413,7 +428,7 @@ exsltFuncFunctionFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
|||||||
xsltFreeStackElemList(params);
|
xsltFreeStackElemList(params);
|
||||||
|
|
||||||
if (data->error != 0)
|
if (data->error != 0)
|
||||||
return;
|
goto error;
|
||||||
|
|
||||||
if (data->result != NULL) {
|
if (data->result != NULL) {
|
||||||
ret = data->result;
|
ret = data->result;
|
||||||
@@ -441,10 +456,13 @@ exsltFuncFunctionFunction (xmlXPathParserContextPtr ctxt, int nargs) {
|
|||||||
"executing a function\n",
|
"executing a function\n",
|
||||||
ctxt->context->functionURI, ctxt->context->function);
|
ctxt->context->functionURI, ctxt->context->function);
|
||||||
xmlFreeNode(fake);
|
xmlFreeNode(fake);
|
||||||
return;
|
goto error;
|
||||||
}
|
}
|
||||||
xmlFreeNode(fake);
|
xmlFreeNode(fake);
|
||||||
valuePush(ctxt, ret);
|
valuePush(ctxt, ret);
|
||||||
|
|
||||||
|
error:
|
||||||
|
tctxt->depth--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
1
tests/docs/bug-201.xml
Normal file
1
tests/docs/bug-201.xml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<doc/>
|
6
tests/general/bug-201.err
Normal file
6
tests/general/bug-201.err
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
runtime error: file ./bug-201.xsl line 13 element copy-of
|
||||||
|
exsltFuncFunctionFunction: Potentially infinite recursion detected in function {test}func.
|
||||||
|
xmlXPathCompiledEval: evaluation failed
|
||||||
|
runtime error: file ./bug-201.xsl line 8 element param
|
||||||
|
Failed to evaluate the expression of variable 'var'.
|
||||||
|
no result for ./../docs/bug-201.xml
|
0
tests/general/bug-201.out
Normal file
0
tests/general/bug-201.out
Normal file
16
tests/general/bug-201.xsl
Normal file
16
tests/general/bug-201.xsl
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<xsl:stylesheet
|
||||||
|
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||||
|
xmlns:func="http://exslt.org/functions"
|
||||||
|
xmlns:test="test"
|
||||||
|
extension-element-prefixes="func">
|
||||||
|
|
||||||
|
<func:function name="test:func">
|
||||||
|
<xsl:param name="var" select="test:func()"/>
|
||||||
|
<func:result select="$var"/>
|
||||||
|
</func:function>
|
||||||
|
|
||||||
|
<xsl:template match="/">
|
||||||
|
<xsl:copy-of select="test:func()"/>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
</xsl:stylesheet>
|
Reference in New Issue
Block a user