diff --git a/libs/xslt/libxslt/extensions.c b/libs/xslt/libxslt/extensions.c index f9ca08e7db7..91df1d4468f 100644 --- a/libs/xslt/libxslt/extensions.c +++ b/libs/xslt/libxslt/extensions.c @@ -12,6 +12,7 @@ #define IN_LIBXSLT #include "libxslt.h" +#include #include #include @@ -26,6 +27,7 @@ #endif #include #include +#include #include "xslt.h" #include "xsltInternals.h" #include "xsltlocale.h" @@ -809,17 +811,13 @@ xsltStyleGetExtData(xsltStylesheetPtr style, const xmlChar * URI) * Old behaviour. */ tmpStyle = style; - while (tmpStyle != NULL) { - if (tmpStyle->extInfos != NULL) { - dataContainer = - (xsltExtDataPtr) xmlHashLookup(tmpStyle->extInfos, URI); - if (dataContainer != NULL) { - return(dataContainer->extData); - } - } - tmpStyle = xsltNextImport(tmpStyle); + if (tmpStyle->extInfos != NULL) { + dataContainer = + (xsltExtDataPtr) xmlHashLookup(tmpStyle->extInfos, URI); + if (dataContainer != NULL) { + return(dataContainer->extData); + } } - tmpStyle = style; #endif dataContainer = @@ -2351,32 +2349,34 @@ xsltDebugDumpExtensions(FILE * output) output = stdout; fprintf(output, "Registered XSLT Extensions\n--------------------------\n"); - if (!xsltFunctionsHash) + xmlMutexLock(xsltExtMutex); + if (!xsltFunctionsHash) { fprintf(output, "No registered extension functions\n"); - else { - fprintf(output, "Registered Extension Functions:\n"); - xmlMutexLock(xsltExtMutex); + } else { + fprintf(output, "Registered extension functions:\n"); xmlHashScanFull(xsltFunctionsHash, xsltDebugDumpExtensionsCallback, output); - xmlMutexUnlock(xsltExtMutex); } - if (!xsltElementsHash) - fprintf(output, "\nNo registered extension elements\n"); - else { - fprintf(output, "\nRegistered Extension Elements:\n"); - xmlMutexLock(xsltExtMutex); + if (!xsltTopLevelsHash) { + fprintf(output, "\nNo registered top-level extension elements\n"); + } else { + fprintf(output, "\nRegistered top-level extension elements:\n"); + xmlHashScanFull(xsltTopLevelsHash, xsltDebugDumpExtensionsCallback, + output); + } + if (!xsltElementsHash) { + fprintf(output, "\nNo registered instruction extension elements\n"); + } else { + fprintf(output, "\nRegistered instruction extension elements:\n"); xmlHashScanFull(xsltElementsHash, xsltDebugDumpExtensionsCallback, output); - xmlMutexUnlock(xsltExtMutex); } - if (!xsltExtensionsHash) + if (!xsltExtensionsHash) { fprintf(output, "\nNo registered extension modules\n"); - else { - fprintf(output, "\nRegistered Extension Modules:\n"); - xmlMutexLock(xsltExtMutex); + } else { + fprintf(output, "\nRegistered extension modules:\n"); xmlHashScanFull(xsltExtensionsHash, xsltDebugDumpExtModulesCallback, output); - xmlMutexUnlock(xsltExtMutex); } - + xmlMutexUnlock(xsltExtMutex); } diff --git a/libs/xslt/libxslt/imports.c b/libs/xslt/libxslt/imports.c index bf2196e9936..112c6e82714 100644 --- a/libs/xslt/libxslt/imports.c +++ b/libs/xslt/libxslt/imports.c @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -53,29 +53,49 @@ static void xsltFixImportedCompSteps(xsltStylesheetPtr master, } } +#define XSLT_MAX_NESTING 40 + static int -xsltCheckCycle(xsltStylesheetPtr style, const xmlChar *URI) { +xsltCheckCycle(xsltStylesheetPtr style, xmlNodePtr cur, const xmlChar *URI) { xsltStylesheetPtr ancestor; xsltDocumentPtr docptr; + int depth; /* - * in order to detect recursion, we check all previously included - * stylesheets. - */ - docptr = style->includes; - while (docptr != NULL) { - if (xmlStrEqual(docptr->doc->URL, URI)) - return(-1); - docptr = docptr->includes; - } - - /* - * Also check imported stylesheets. + * Check imported stylesheets. */ + depth = 0; ancestor = style; while (ancestor != NULL) { - if (xmlStrEqual(ancestor->doc->URL, URI)) + if (++depth >= XSLT_MAX_NESTING) { + xsltTransformError(NULL, style, cur, + "maximum nesting depth exceeded: %s\n", URI); + return(-1); + } + if (xmlStrEqual(ancestor->doc->URL, URI)) { + xsltTransformError(NULL, style, cur, + "recursion detected on imported URL %s\n", URI); return(-1); + } + + /* + * Check included stylesheets. + */ + docptr = ancestor->includes; + while (docptr != NULL) { + if (++depth >= XSLT_MAX_NESTING) { + xsltTransformError(NULL, style, cur, + "maximum nesting depth exceeded: %s\n", URI); + return(-1); + } + if (xmlStrEqual(docptr->doc->URL, URI)) { + xsltTransformError(NULL, style, cur, + "recursion detected on included URL %s\n", URI); + return(-1); + } + docptr = docptr->includes; + } + ancestor = ancestor->parent; } @@ -120,11 +140,8 @@ xsltParseStylesheetImport(xsltStylesheetPtr style, xmlNodePtr cur) { goto error; } - if (xsltCheckCycle(style, URI) < 0) { - xsltTransformError(NULL, style, cur, - "xsl:import : recursion detected on imported URL %s\n", URI); + if (xsltCheckCycle(style, cur, URI) < 0) goto error; - } /* * Security framework check @@ -213,11 +230,8 @@ xsltParseStylesheetInclude(xsltStylesheetPtr style, xmlNodePtr cur) { goto error; } - if (xsltCheckCycle(style, URI) < 0) { - xsltTransformError(NULL, style, cur, - "xsl:include : recursion detected on included URL %s\n", URI); + if (xsltCheckCycle(style, cur, URI) < 0) goto error; - } include = xsltLoadStyleDocument(style, URI); if (include == NULL) { @@ -406,4 +420,3 @@ xsltFindTemplate(xsltTransformContextPtr ctxt, const xmlChar *name, } return(NULL); } - diff --git a/libs/xslt/libxslt/security.c b/libs/xslt/libxslt/security.c index 1f7187c7f94..eb397e42a35 100644 --- a/libs/xslt/libxslt/security.c +++ b/libs/xslt/libxslt/security.c @@ -37,7 +37,7 @@ #endif #include -#include +#include #include #include "xslt.h" #include "xsltInternals.h" @@ -463,4 +463,3 @@ xsltCheckRead(xsltSecurityPrefsPtr sec, xmlFreeURI(uri); return(1); } - diff --git a/libs/xslt/libxslt/transform.c b/libs/xslt/libxslt/transform.c index 0fc0400c1f9..54ef821b501 100644 --- a/libs/xslt/libxslt/transform.c +++ b/libs/xslt/libxslt/transform.c @@ -1992,7 +1992,21 @@ xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node, case XML_ELEMENT_NODE: ctxt->xpathCtxt->contextSize = nbchild; ctxt->xpathCtxt->proximityPosition = childno; + + if (ctxt->depth >= ctxt->maxTemplateDepth) { + xsltTransformError(ctxt, NULL, cur, + "xsltDefaultProcessOneNode: Maximum template depth " + "exceeded.\n" + "You can adjust xsltMaxDepth (--maxdepth) in order to " + "raise the maximum number of nested template calls and " + "variables/params (currently set to %d).\n", + ctxt->maxTemplateDepth); + ctxt->state = XSLT_STATE_STOPPED; + return; + } + ctxt->depth++; xsltProcessOneNode(ctxt, cur, params); + ctxt->depth--; break; case XML_CDATA_SECTION_NODE: template = xsltGetTemplate(ctxt, cur, NULL); diff --git a/libs/xslt/libxslt/xsltconfig.h b/libs/xslt/libxslt/xsltconfig.h index f524fbfe1b1..a884b648edb 100644 --- a/libs/xslt/libxslt/xsltconfig.h +++ b/libs/xslt/libxslt/xsltconfig.h @@ -20,21 +20,21 @@ extern "C" { * * the version string like "1.2.3" */ -#define LIBXSLT_DOTTED_VERSION "1.1.38" +#define LIBXSLT_DOTTED_VERSION "1.1.39" /** * LIBXSLT_VERSION: * * the version number: 1.2.3 value is 10203 */ -#define LIBXSLT_VERSION 10138 +#define LIBXSLT_VERSION 10139 /** * LIBXSLT_VERSION_STRING: * * the version number string, 1.2.3 value is "10203" */ -#define LIBXSLT_VERSION_STRING "10138" +#define LIBXSLT_VERSION_STRING "10139" /** * LIBXSLT_VERSION_EXTRA: diff --git a/libs/xslt/libxslt/xsltlocale.c b/libs/xslt/libxslt/xsltlocale.c index 5a9291887ec..aa38ccf7950 100644 --- a/libs/xslt/libxslt/xsltlocale.c +++ b/libs/xslt/libxslt/xsltlocale.c @@ -15,6 +15,7 @@ #include #include +#include #include "xsltlocale.h" #include "xsltutils.h" diff --git a/libs/xslt/libxslt/xsltlocale.h b/libs/xslt/libxslt/xsltlocale.h index 10a4402f1f2..c8be58d3dbe 100644 --- a/libs/xslt/libxslt/xsltlocale.h +++ b/libs/xslt/libxslt/xsltlocale.h @@ -14,6 +14,10 @@ #include #include "xsltexports.h" +#ifdef __cplusplus +extern "C" { +#endif + XSLTPUBFUN void * XSLTCALL xsltNewLocale (const xmlChar *langName, int lowerFirst); @@ -33,4 +37,8 @@ XSLTPUBFUN int XSLTCALL const xmlChar *str1, const xmlChar *str2); +#ifdef __cplusplus +} +#endif + #endif /* __XML_XSLTLOCALE_H__ */ diff --git a/libs/xslt/libxslt/xsltutils.h b/libs/xslt/libxslt/xsltutils.h index ed0bfd91f07..c1751e4e249 100644 --- a/libs/xslt/libxslt/xsltutils.h +++ b/libs/xslt/libxslt/xsltutils.h @@ -164,7 +164,7 @@ XSLTPUBFUN void XSLTCALL xsltSetTransformErrorFunc (xsltTransformContextPtr ctxt, void *ctx, xmlGenericErrorFunc handler); -XSLTPUBFUN void WINAPIV +XSLTPUBFUN void XSLTCALL xsltTransformError (xsltTransformContextPtr ctxt, xsltStylesheetPtr style, xmlNodePtr node, @@ -339,5 +339,3 @@ XSLTPUBFUN void XSLTCALL #endif #endif /* __XML_XSLTUTILS_H__ */ - -