Re: [xslt] [XSLT] [PATCH] unglobalize xsltMaxDepth variable - take 2
- From: Daniel Veillard <veillard redhat com>
- To: Jérôme Carretero <cJ-lxml zougloub eu>
- Cc: The Gnome XSLT library mailing-list <xslt gnome org>
- Subject: Re: [xslt] [XSLT] [PATCH] unglobalize xsltMaxDepth variable - take 2
- Date: Tue, 22 Mar 2011 10:21:22 +0800
On Sun, Mar 20, 2011 at 10:25:29PM -0400, Jérôme Carretero wrote:
> Hi,
>
> A few weeks (months?) ago I submitted a patch to unglobalize the maximum template recursion parameter in libxslt.
hum seems I missed it, probably during Dec-Feb while I didn't
got all my mail.
> This small patch has been cleaned-up, and a new version is attached.
thanks,
> Comments are welcome.
[...]
> diff --git a/libxslt/libxslt.syms b/libxslt/libxslt.syms
> index 45fa74b..63cacf0 100644
> --- a/libxslt/libxslt.syms
> +++ b/libxslt/libxslt.syms
> @@ -306,7 +306,6 @@ LIBXML2_1.0.24 {
> # xslt
> xsltLibxmlVersion; # variable
> xsltLibxsltVersion; # variable
> - xsltMaxDepth; # variable
>
> # xsltInternals
> xsltParseStylesheetImportedDoc;
> diff --git a/libxslt/transform.c b/libxslt/transform.c
> index 948d7d0..a7eb035 100644
> --- a/libxslt/transform.c
> +++ b/libxslt/transform.c
> @@ -63,8 +63,6 @@ static int xsltGetHTMLIDs(const xmlChar *version, const xmlChar **publicID,
> const xmlChar **systemID);
> #endif
>
> -int xsltMaxDepth = 3000;
> -
We can't do that, it breaks the library ABI. The symbol has to stay
and its default behaviour must be preserved.
> * Useful macros
> */
> @@ -504,6 +502,7 @@ xsltNewTransformContext(xsltStylesheetPtr style, xmlDocPtr doc) {
> cur->templNr = 0;
> cur->templMax = 5;
> cur->templ = NULL;
> + cur->maxTemplateDepth = 10000;
initialize from xsltMaxDepth instead
> /*
> * initialize the variables stack
> @@ -519,6 +518,7 @@ xsltNewTransformContext(xsltStylesheetPtr style, xmlDocPtr doc) {
> cur->varsMax = 10;
> cur->vars = NULL;
> cur->varsBase = 0;
> + cur->maxTemplateVars = 50000;
>
> /*
> * the profiling stack is not initialized by default
> @@ -2983,20 +2983,31 @@ xsltApplyXSLTTemplate(xsltTransformContextPtr ctxt,
> * Check for infinite recursion: stop if the maximum of nested templates
> * is excceeded. Adjust xsltMaxDepth if you need more.
> */
> - if (((ctxt->templNr >= xsltMaxDepth) ||
> - (ctxt->varsNr >= 5 * xsltMaxDepth)))
> + if (ctxt->templNr >= ctxt->maxTemplateDepth)
> {
> xsltTransformError(ctxt, NULL, list,
> "xsltApplyXSLTTemplate: A potential infinite template recursion "
> "was detected.\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",
> - xsltMaxDepth);
> + "You can adjust maxTemplateDepth (--maxdepth) in order to "
> + "raise the maximum number of nested template calls "
> + " (currently set to %d).\n",
> + ctxt->maxTemplateDepth);
the error messages will have to be preserved I think.
> return;
> }
>
> + if (ctxt->varsNr >= ctxt->maxTemplateVars)
> + {
> + xsltTransformError(ctxt, NULL, list,
> + "xsltApplyXSLTTemplate: A potential infinite template recursion "
> + "was detected.\n"
> + "You can adjust maxTemplateVars (--maxvars) in order to "
> + "raise the maximum number of variables/params (currently set to %d).\n",
> + ctxt->maxTemplateVars);
> + xsltDebug(ctxt, contextNode, list, NULL);
> + return;
> + }
> +
> oldUserFragmentTop = ctxt->tmpRVT;
> ctxt->tmpRVT = NULL;
> oldLocalFragmentTop = ctxt->localRVT;
> diff --git a/libxslt/xslt.h b/libxslt/xslt.h
> index 849b03c..fa8bb32 100644
> --- a/libxslt/xslt.h
> +++ b/libxslt/xslt.h
> @@ -55,13 +55,6 @@ extern "C" {
> XML_PARSE_NOENT | XML_PARSE_DTDLOAD | XML_PARSE_DTDATTR | XML_PARSE_NOCDATA
>
> /**
> - * xsltMaxDepth:
> - *
> - * This value is used to detect templates loops.
> - */
> -XSLTPUBVAR int xsltMaxDepth;
> -
> -/**
> * xsltEngineVersion:
Not possible
> * The version string for libxslt.
> diff --git a/libxslt/xsltInternals.h b/libxslt/xsltInternals.h
> index 764fe8c..afb2a2c 100644
> --- a/libxslt/xsltInternals.h
> +++ b/libxslt/xsltInternals.h
> @@ -1780,6 +1780,8 @@ struct _xsltTransformContext {
> xmlDocPtr localRVTBase;
> int keyInitLevel; /* Needed to catch recursive keys issues */
> int funcLevel; /* Needed to catch recursive functions issues */
> + int maxTemplateDepth;
> + int maxTemplateVars;
> };
still a good idea to make this tunable dynamically
> /**
> diff --git a/xsltproc/xsltproc.c b/xsltproc/xsltproc.c
> index e978a63..df582fe 100644
> --- a/xsltproc/xsltproc.c
> +++ b/xsltproc/xsltproc.c
> @@ -103,6 +103,8 @@ static int nbpaths = 0;
> static char *output = NULL;
> static int errorno = 0;
> static const char *writesubtree = NULL;
> +static int xsltMaxDepth = 3000;
> +static int xsltMaxVars = 15000;
>
> /*
> * Entity loading control and customization.
> @@ -466,6 +468,9 @@ xsltProcess(xmlDocPtr doc, xsltStylesheetPtr cur, const char *filename) {
> if (xinclude)
> ctxt->xinclude = 1;
> #endif
> + ctxt->maxTemplateDepth = xsltMaxDepth;
> + ctxt->maxTemplateVars = xsltMaxVars;
> +
> if (profile) {
> ret = xsltRunStylesheetUser(cur, doc, params, output,
> NULL, NULL, stderr, ctxt);
> @@ -502,6 +507,7 @@ static void usage(const char *name) {
> printf("\t--nodtdattr do not default attributes from the DTD\n");
> printf("\t--noout: do not dump the result\n");
> printf("\t--maxdepth val : increase the maximum depth\n");
> + printf("\t--maxvars val : increase the maximum variables\n");
Okay
> printf("\t--maxparserdepth val : increase the maximum parser depth\n");
> #ifdef LIBXML_HTML_ENABLED
> printf("\t--html: the input document is(are) an HTML file(s)\n");
> @@ -721,6 +727,15 @@ main(int argc, char **argv)
> if (value > 0)
> xsltMaxDepth = value;
> }
> + } else if ((!strcmp(argv[i], "-maxvars")) ||
> + (!strcmp(argv[i], "--maxvars"))) {
> + int value;
> +
> + i++;
> + if (sscanf(argv[i], "%d", &value) == 1) {
> + if (value > 0)
> + xsltMaxVars = value;
> + }
> } else if ((!strcmp(argv[i], "-maxparserdepth")) ||
> (!strcmp(argv[i], "--maxparserdepth"))) {
> int value;
Weird, I would have expected the xsltproc part to remove a chunk
where --maxdepth uses xsltMaxDepth, but it's still there. Seems you
didn't compile this or didn't compiled it against the local code,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel veillard com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]