Index: third_party/libxslt/libexslt/functions.c |
=================================================================== |
--- third_party/libxslt/libexslt/functions.c (revision 39981) |
+++ third_party/libxslt/libexslt/functions.c (working copy) |
@@ -57,6 +57,8 @@ |
int nargs); |
static exsltFuncFunctionData *exsltFuncNewFunctionData(void); |
+#define MAX_FUNC_RECURSION 1000 |
+ |
/*static const xmlChar *exsltResultDataID = (const xmlChar *) "EXSLT Result";*/ |
/** |
@@ -321,6 +323,15 @@ |
"param == NULL\n"); |
return; |
} |
+ if (tctxt->funcLevel > MAX_FUNC_RECURSION) { |
+ xsltGenericError(xsltGenericErrorContext, |
+ "{%s}%s: detected a recursion\n", |
+ ctxt->context->functionURI, ctxt->context->function); |
+ ctxt->error = XPATH_MEMORY_ERROR; |
+ return; |
+ } |
+ tctxt->funcLevel++; |
+ |
/* |
* We have a problem with the evaluation of function parameters. |
* The original library code did not evaluate XPath expressions until |
@@ -437,6 +448,7 @@ |
* the calling process exits. |
*/ |
xsltExtensionInstructionResultFinalize(tctxt); |
+ tctxt->funcLevel--; |
} |