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

Jérôme Carretero <[email protected]>
Newsgroups gmane.comp.gnome.lib.xslt
Message-ID <[email protected]>
On Tue, 22 Mar 2011 10:21:22 +0800
Daniel Veillard <[email protected]> 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

_______________________________________________
xslt mailing list, project page http://xmlsoft.org/XSLT/
[email protected]
http://mail.gnome.org/mailman/listinfo/xslt
0001-Allow-per-context-override-of-xsltMaxDepth-introduce.patch (text/x-patch, 10.4 KB)
From 2023285828f6666fa81cbc4b56d2de6b3cdd4676 Mon Sep 17 00:00:00 2001
From: Jerome Carretero <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.