xslt: Import upstream release 1.1.39.

This commit is contained in:
Alexandre Julliard 2024-02-17 20:52:21 +01:00
parent 72b7866950
commit f1454777a8
8 changed files with 92 additions and 59 deletions

View file

@ -12,6 +12,7 @@
#define IN_LIBXSLT #define IN_LIBXSLT
#include "libxslt.h" #include "libxslt.h"
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
@ -26,6 +27,7 @@
#endif #endif
#include <libxml/list.h> #include <libxml/list.h>
#include <libxml/xmlIO.h> #include <libxml/xmlIO.h>
#include <libxml/threads.h>
#include "xslt.h" #include "xslt.h"
#include "xsltInternals.h" #include "xsltInternals.h"
#include "xsltlocale.h" #include "xsltlocale.h"
@ -809,17 +811,13 @@ xsltStyleGetExtData(xsltStylesheetPtr style, const xmlChar * URI)
* Old behaviour. * Old behaviour.
*/ */
tmpStyle = style; tmpStyle = style;
while (tmpStyle != NULL) { if (tmpStyle->extInfos != NULL) {
if (tmpStyle->extInfos != NULL) { dataContainer =
dataContainer = (xsltExtDataPtr) xmlHashLookup(tmpStyle->extInfos, URI);
(xsltExtDataPtr) xmlHashLookup(tmpStyle->extInfos, URI); if (dataContainer != NULL) {
if (dataContainer != NULL) { return(dataContainer->extData);
return(dataContainer->extData); }
}
}
tmpStyle = xsltNextImport(tmpStyle);
} }
tmpStyle = style;
#endif #endif
dataContainer = dataContainer =
@ -2351,32 +2349,34 @@ xsltDebugDumpExtensions(FILE * output)
output = stdout; output = stdout;
fprintf(output, fprintf(output,
"Registered XSLT Extensions\n--------------------------\n"); "Registered XSLT Extensions\n--------------------------\n");
if (!xsltFunctionsHash) xmlMutexLock(xsltExtMutex);
if (!xsltFunctionsHash) {
fprintf(output, "No registered extension functions\n"); fprintf(output, "No registered extension functions\n");
else { } else {
fprintf(output, "Registered Extension Functions:\n"); fprintf(output, "Registered extension functions:\n");
xmlMutexLock(xsltExtMutex);
xmlHashScanFull(xsltFunctionsHash, xsltDebugDumpExtensionsCallback, xmlHashScanFull(xsltFunctionsHash, xsltDebugDumpExtensionsCallback,
output); output);
xmlMutexUnlock(xsltExtMutex);
} }
if (!xsltElementsHash) if (!xsltTopLevelsHash) {
fprintf(output, "\nNo registered extension elements\n"); fprintf(output, "\nNo registered top-level extension elements\n");
else { } else {
fprintf(output, "\nRegistered Extension Elements:\n"); fprintf(output, "\nRegistered top-level extension elements:\n");
xmlMutexLock(xsltExtMutex); 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, xmlHashScanFull(xsltElementsHash, xsltDebugDumpExtensionsCallback,
output); output);
xmlMutexUnlock(xsltExtMutex);
} }
if (!xsltExtensionsHash) if (!xsltExtensionsHash) {
fprintf(output, "\nNo registered extension modules\n"); fprintf(output, "\nNo registered extension modules\n");
else { } else {
fprintf(output, "\nRegistered Extension Modules:\n"); fprintf(output, "\nRegistered extension modules:\n");
xmlMutexLock(xsltExtMutex);
xmlHashScanFull(xsltExtensionsHash, xsltDebugDumpExtModulesCallback, xmlHashScanFull(xsltExtensionsHash, xsltDebugDumpExtModulesCallback,
output); output);
xmlMutexUnlock(xsltExtMutex);
} }
xmlMutexUnlock(xsltExtMutex);
} }

View file

@ -15,7 +15,7 @@
#include <string.h> #include <string.h>
#include <libxml/xmlmemory.h> #include <libxml/xmlmemory.h>
#include <libxml/tree.h> #include <libxml/parser.h>
#include <libxml/hash.h> #include <libxml/hash.h>
#include <libxml/xmlerror.h> #include <libxml/xmlerror.h>
#include <libxml/uri.h> #include <libxml/uri.h>
@ -53,29 +53,49 @@ static void xsltFixImportedCompSteps(xsltStylesheetPtr master,
} }
} }
#define XSLT_MAX_NESTING 40
static int static int
xsltCheckCycle(xsltStylesheetPtr style, const xmlChar *URI) { xsltCheckCycle(xsltStylesheetPtr style, xmlNodePtr cur, const xmlChar *URI) {
xsltStylesheetPtr ancestor; xsltStylesheetPtr ancestor;
xsltDocumentPtr docptr; xsltDocumentPtr docptr;
int depth;
/* /*
* in order to detect recursion, we check all previously included * Check imported stylesheets.
* stylesheets.
*/
docptr = style->includes;
while (docptr != NULL) {
if (xmlStrEqual(docptr->doc->URL, URI))
return(-1);
docptr = docptr->includes;
}
/*
* Also check imported stylesheets.
*/ */
depth = 0;
ancestor = style; ancestor = style;
while (ancestor != NULL) { 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); 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; ancestor = ancestor->parent;
} }
@ -120,11 +140,8 @@ xsltParseStylesheetImport(xsltStylesheetPtr style, xmlNodePtr cur) {
goto error; goto error;
} }
if (xsltCheckCycle(style, URI) < 0) { if (xsltCheckCycle(style, cur, URI) < 0)
xsltTransformError(NULL, style, cur,
"xsl:import : recursion detected on imported URL %s\n", URI);
goto error; goto error;
}
/* /*
* Security framework check * Security framework check
@ -213,11 +230,8 @@ xsltParseStylesheetInclude(xsltStylesheetPtr style, xmlNodePtr cur) {
goto error; goto error;
} }
if (xsltCheckCycle(style, URI) < 0) { if (xsltCheckCycle(style, cur, URI) < 0)
xsltTransformError(NULL, style, cur,
"xsl:include : recursion detected on included URL %s\n", URI);
goto error; goto error;
}
include = xsltLoadStyleDocument(style, URI); include = xsltLoadStyleDocument(style, URI);
if (include == NULL) { if (include == NULL) {
@ -406,4 +420,3 @@ xsltFindTemplate(xsltTransformContextPtr ctxt, const xmlChar *name,
} }
return(NULL); return(NULL);
} }

View file

@ -37,7 +37,7 @@
#endif #endif
#include <libxml/xmlmemory.h> #include <libxml/xmlmemory.h>
#include <libxml/tree.h> #include <libxml/parser.h>
#include <libxml/uri.h> #include <libxml/uri.h>
#include "xslt.h" #include "xslt.h"
#include "xsltInternals.h" #include "xsltInternals.h"
@ -463,4 +463,3 @@ xsltCheckRead(xsltSecurityPrefsPtr sec,
xmlFreeURI(uri); xmlFreeURI(uri);
return(1); return(1);
} }

View file

@ -1992,7 +1992,21 @@ xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
case XML_ELEMENT_NODE: case XML_ELEMENT_NODE:
ctxt->xpathCtxt->contextSize = nbchild; ctxt->xpathCtxt->contextSize = nbchild;
ctxt->xpathCtxt->proximityPosition = childno; 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); xsltProcessOneNode(ctxt, cur, params);
ctxt->depth--;
break; break;
case XML_CDATA_SECTION_NODE: case XML_CDATA_SECTION_NODE:
template = xsltGetTemplate(ctxt, cur, NULL); template = xsltGetTemplate(ctxt, cur, NULL);

View file

@ -20,21 +20,21 @@ extern "C" {
* *
* the version string like "1.2.3" * the version string like "1.2.3"
*/ */
#define LIBXSLT_DOTTED_VERSION "1.1.38" #define LIBXSLT_DOTTED_VERSION "1.1.39"
/** /**
* LIBXSLT_VERSION: * LIBXSLT_VERSION:
* *
* the version number: 1.2.3 value is 10203 * the version number: 1.2.3 value is 10203
*/ */
#define LIBXSLT_VERSION 10138 #define LIBXSLT_VERSION 10139
/** /**
* LIBXSLT_VERSION_STRING: * LIBXSLT_VERSION_STRING:
* *
* the version number string, 1.2.3 value is "10203" * the version number string, 1.2.3 value is "10203"
*/ */
#define LIBXSLT_VERSION_STRING "10138" #define LIBXSLT_VERSION_STRING "10139"
/** /**
* LIBXSLT_VERSION_EXTRA: * LIBXSLT_VERSION_EXTRA:

View file

@ -15,6 +15,7 @@
#include <string.h> #include <string.h>
#include <libxml/xmlmemory.h> #include <libxml/xmlmemory.h>
#include <libxml/threads.h>
#include "xsltlocale.h" #include "xsltlocale.h"
#include "xsltutils.h" #include "xsltutils.h"

View file

@ -14,6 +14,10 @@
#include <libxml/xmlstring.h> #include <libxml/xmlstring.h>
#include "xsltexports.h" #include "xsltexports.h"
#ifdef __cplusplus
extern "C" {
#endif
XSLTPUBFUN void * XSLTCALL XSLTPUBFUN void * XSLTCALL
xsltNewLocale (const xmlChar *langName, xsltNewLocale (const xmlChar *langName,
int lowerFirst); int lowerFirst);
@ -33,4 +37,8 @@ XSLTPUBFUN int XSLTCALL
const xmlChar *str1, const xmlChar *str1,
const xmlChar *str2); const xmlChar *str2);
#ifdef __cplusplus
}
#endif
#endif /* __XML_XSLTLOCALE_H__ */ #endif /* __XML_XSLTLOCALE_H__ */

View file

@ -164,7 +164,7 @@ XSLTPUBFUN void XSLTCALL
xsltSetTransformErrorFunc (xsltTransformContextPtr ctxt, xsltSetTransformErrorFunc (xsltTransformContextPtr ctxt,
void *ctx, void *ctx,
xmlGenericErrorFunc handler); xmlGenericErrorFunc handler);
XSLTPUBFUN void WINAPIV XSLTPUBFUN void XSLTCALL
xsltTransformError (xsltTransformContextPtr ctxt, xsltTransformError (xsltTransformContextPtr ctxt,
xsltStylesheetPtr style, xsltStylesheetPtr style,
xmlNodePtr node, xmlNodePtr node,
@ -339,5 +339,3 @@ XSLTPUBFUN void XSLTCALL
#endif #endif
#endif /* __XML_XSLTUTILS_H__ */ #endif /* __XML_XSLTUTILS_H__ */