Re: [xslt] [XSLT] [PATCH] unglobalize xsltMaxDepth variable - take 2



On Tue, 22 Mar 2011 10:21:22 +0800
Daniel Veillard <veillard redhat com> wrote:

>   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,

Oops. Yes I did not compile it.
Attached take 3, which has been more thoroughly tested and also patches the documentation.

Regards,

-- 
cJ
>From 2023285828f6666fa81cbc4b56d2de6b3cdd4676 Mon Sep 17 00:00:00 2001
From: Jerome Carretero <cJ zougloub eu>
Date: Fri, 25 Mar 2011 23:15:16 -0400
Subject: [PATCH] Allow per-context override of xsltMaxDepth, introduce xsltMaxVars.

---
 doc/APIfiles.html         |    1 +
 doc/libxslt-api.xml       |    2 ++
 doc/libxslt-decl.txt      |    4 ++++
 doc/libxslt-refs.xml      |    3 +++
 doc/symbols.xml           |    1 +
 libxslt/libxslt.syms      |    1 +
 libxslt/transform.c       |   20 +++++++++++++++++---
 libxslt/xslt.h            |    7 +++++++
 libxslt/xsltInternals.h   |    2 ++
 win32/libxslt.def.src     |    1 +
 win32/libxslt/libxslt.def |    1 +
 xsltproc/xsltproc.c       |   15 ++++++++++++++-
 12 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/doc/APIfiles.html b/doc/APIfiles.html
index 4c312dc..d199166 100644
--- a/doc/APIfiles.html
+++ b/doc/APIfiles.html
@@ -221,6 +221,7 @@ A:link, A:visited, A:active { text-decoration: underline }
 <a href="html/libxslt-xslt.html#xsltLibxmlVersion">xsltLibxmlVersion</a><br />
 <a href="html/libxslt-xslt.html#xsltLibxsltVersion">xsltLibxsltVersion</a><br />
 <a href="html/libxslt-xslt.html#xsltMaxDepth">xsltMaxDepth</a><br />
+<a href="html/libxslt-xslt.html#xsltMaxVars">xsltMaxVars</a><br />
 </p><h2><a name="xsltInternals" id="xsltInternals">Module xsltInternals</a>:</h2><p><a href="html/libxslt-xsltInternals.html#CHECK_STOPPED">CHECK_STOPPED</a><br />
 <a href="html/libxslt-xsltInternals.html#CHECK_STOPPED0">CHECK_STOPPED0</a><br />
 <a href="html/libxslt-xsltInternals.html#CHECK_STOPPEDE">CHECK_STOPPEDE</a><br />
diff --git a/doc/libxslt-api.xml b/doc/libxslt-api.xml
index d0ed1a2..fbc32de 100644
--- a/doc/libxslt-api.xml
+++ b/doc/libxslt-api.xml
@@ -291,6 +291,7 @@
      <exports symbol='xsltEngineVersion' type='variable'/>
      <exports symbol='xsltLibxsltVersion' type='variable'/>
      <exports symbol='xsltMaxDepth' type='variable'/>
+     <exports symbol='xsltMaxVars' type='variable'/>
      <exports symbol='xsltCleanupGlobals' type='function'/>
      <exports symbol='xsltInit' type='function'/>
     </file>
@@ -1560,6 +1561,7 @@ exits'/>
     <variable name='xsltLibxmlVersion' file='xslt' type='const int'/>
     <variable name='xsltLibxsltVersion' file='xslt' type='const int'/>
     <variable name='xsltMaxDepth' file='xslt' type='int'/>
+    <variable name='xsltMaxVars' file='xslt' type='int'/>
     <variable name='xsltXSLTAttrMarker' file='xsltInternals' type='const xmlChar *'/>
     <function name='xslAddCall' file='xsltutils'>
       <info>Add template &quot;call&quot; to call stack</info>
diff --git a/doc/libxslt-decl.txt b/doc/libxslt-decl.txt
index f018274..423230e 100644
--- a/doc/libxslt-decl.txt
+++ b/doc/libxslt-decl.txt
@@ -238,6 +238,10 @@ extern const xmlChar *xsltExtMarker;
 extern int xsltMaxDepth;
 </VARIABLE>
 <VARIABLE>
+<NAME>xsltMaxVars</NAME>
+extern int xsltMaxVars;
+</VARIABLE>
+<VARIABLE>
 <NAME>xsltEngineVersion</NAME>
 extern const char *xsltEngineVersion;
 </VARIABLE>
diff --git a/doc/libxslt-refs.xml b/doc/libxslt-refs.xml
index c21e6d2..33adb26 100644
--- a/doc/libxslt-refs.xml
+++ b/doc/libxslt-refs.xml
@@ -352,6 +352,7 @@
     <reference name='xsltLocaleStrcmp' href='html/libxslt-xsltlocale.html#xsltLocaleStrcmp'/>
     <reference name='xsltMatchPattern' href='html/libxslt-pattern.html#xsltMatchPattern'/>
     <reference name='xsltMaxDepth' href='html/libxslt-xslt.html#xsltMaxDepth'/>
+    <reference name='xsltMaxVars' href='html/libxslt-xslt.html#xsltMaxVars'/>
     <reference name='xsltMessage' href='html/libxslt-xsltutils.html#xsltMessage'/>
     <reference name='xsltNamespaceAlias' href='html/libxslt-namespaces.html#xsltNamespaceAlias'/>
     <reference name='xsltNeedElemSpaceHandling' href='html/libxslt-imports.html#xsltNeedElemSpaceHandling'/>
@@ -937,6 +938,7 @@
       <ref name='xsltLocaleStrcmp'/>
       <ref name='xsltMatchPattern'/>
       <ref name='xsltMaxDepth'/>
+      <ref name='xsltMaxVars'/>
       <ref name='xsltMessage'/>
       <ref name='xsltNamespaceAlias'/>
       <ref name='xsltNeedElemSpaceHandling'/>
@@ -2169,6 +2171,7 @@
       <ref name='xsltLibxmlVersion'/>
       <ref name='xsltLibxsltVersion'/>
       <ref name='xsltMaxDepth'/>
+      <ref name='xsltMaxVars'/>
     </file>
     <file name='xsltInternals'>
       <ref name='CHECK_STOPPED'/>
diff --git a/doc/symbols.xml b/doc/symbols.xml
index 2eea92c..9e199e8 100644
--- a/doc/symbols.xml
+++ b/doc/symbols.xml
@@ -221,6 +221,7 @@
     <symbol file="xslt">xsltLibxmlVersion</symbol>
     <symbol file="xslt">xsltLibxsltVersion</symbol>
     <symbol file="xslt">xsltMaxDepth</symbol>
+    <symbol file="xslt">xsltMaxVars</symbol>
     <symbol file="xsltInternals">xsltParseStylesheetImportedDoc</symbol>
     <symbol file="xsltutils">xsltSetCtxtSortFunc</symbol>
     <symbol file="xsltutils">xsltSetSortFunc</symbol>
diff --git a/libxslt/libxslt.syms b/libxslt/libxslt.syms
index 45fa74b..7a7e6c3 100644
--- a/libxslt/libxslt.syms
+++ b/libxslt/libxslt.syms
@@ -307,6 +307,7 @@ LIBXML2_1.0.24 {
   xsltLibxmlVersion; # variable
   xsltLibxsltVersion; # variable
   xsltMaxDepth; # variable
+  xsltMaxVars; # variable
 
 # xsltInternals
   xsltParseStylesheetImportedDoc;
diff --git a/libxslt/transform.c b/libxslt/transform.c
index 948d7d0..53eefcc 100644
--- a/libxslt/transform.c
+++ b/libxslt/transform.c
@@ -64,6 +64,7 @@ static int xsltGetHTMLIDs(const xmlChar *version, const xmlChar **publicID,
 #endif
 
 int xsltMaxDepth = 3000;
+int xsltMaxVars = 15000;
 
 /*
  * Useful macros
@@ -504,6 +505,7 @@ xsltNewTransformContext(xsltStylesheetPtr style, xmlDocPtr doc) {
     cur->templNr = 0;
     cur->templMax = 5;
     cur->templ = NULL;
+    cur->maxTemplateDepth = xsltMaxDepth;
 
     /*
      * initialize the variables stack
@@ -519,6 +521,7 @@ xsltNewTransformContext(xsltStylesheetPtr style, xmlDocPtr doc) {
     cur->varsMax = 10;
     cur->vars = NULL;
     cur->varsBase = 0;
+    cur->maxTemplateVars = xsltMaxVars;
 
     /*
      * the profiling stack is not initialized by default
@@ -2983,8 +2986,7 @@ 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 "
@@ -2992,11 +2994,23 @@ xsltApplyXSLTTemplate(xsltTransformContextPtr ctxt,
 	    "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);
+	    ctxt->maxTemplateDepth);
         xsltDebug(ctxt, contextNode, list, NULL);
         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..13a68be 100644
--- a/libxslt/xslt.h
+++ b/libxslt/xslt.h
@@ -62,6 +62,13 @@ extern "C" {
 XSLTPUBVAR int xsltMaxDepth;
 
 /**
+ *  * xsltMaxVars:
+ *   *
+ *    * This value is used to detect templates loops.
+ *     */
+XSLTPUBVAR int xsltMaxVars;
+
+/**
  * xsltEngineVersion:
  *
  * 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;
 };
 
 /**
diff --git a/win32/libxslt.def.src b/win32/libxslt.def.src
index 892d34b..1d17bac 100644
--- a/win32/libxslt.def.src
+++ b/win32/libxslt.def.src
@@ -12,6 +12,7 @@ xsltGenericErrorContext DATA
 xsltLibxmlVersion DATA
 xsltLibxsltVersion DATA
 xsltMaxDepth DATA
+xsltMaxVars DATA
 xsltXSLTAttrMarker DATA
 xslAddCall
 xslDropCall
diff --git a/win32/libxslt/libxslt.def b/win32/libxslt/libxslt.def
index 0992b4a..dc6f1a0 100644
--- a/win32/libxslt/libxslt.def
+++ b/win32/libxslt/libxslt.def
@@ -134,6 +134,7 @@ EXPORTS
 	xsltSaveResultToFd
 
 	xsltMaxDepth
+	xsltMaxVars
 	xsltSetXIncludeDefault
 	xsltLibxmlVersion
 	xsltLibxsltVersion
diff --git a/xsltproc/xsltproc.c b/xsltproc/xsltproc.c
index e978a63..651ec5f 100644
--- a/xsltproc/xsltproc.c
+++ b/xsltproc/xsltproc.c
@@ -466,6 +466,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);
@@ -501,7 +504,8 @@ static void usage(const char *name) {
     printf("\t--novalid skip the Dtd loading phase\n");
     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--maxdepth val : increase the maximum depth (default %d)\n", xsltMaxDepth);
+    printf("\t--maxvars val : increase the maximum variables (default %d)\n", xsltMaxVars);
     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 +725,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;
-- 
1.7.4.1



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]