[Python-checkins] cpython (3.3): don't scale compiler stack frames if the recursion limit is huge (closes #19098)

benjamin.peterson python-checkins at python.org
Fri Sep 27 04:22:14 CEST 2013


http://hg.python.org/cpython/rev/c3df31cbcd0a
changeset:   85803:c3df31cbcd0a
branch:      3.3
parent:      85793:5c1c67d980bb
user:        Benjamin Peterson <benjamin at python.org>
date:        Thu Sep 26 22:17:45 2013 -0400
summary:
  don't scale compiler stack frames if the recursion limit is huge (closes #19098)

files:
  Misc/NEWS         |  3 +++
  Python/symtable.c |  8 ++++++--
  2 files changed, 9 insertions(+), 2 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@
 Core and Builtins
 -----------------
 
+- Issue #19098: Prevent overflow in the compiler when the recursion limit is set
+  absurbly high.
+
 - Issue #18942: sys._debugmallocstats() output was damaged on Windows.
 
 - Issue #18667: Add missing "HAVE_FCHOWNAT" symbol to posix._have_functions.
diff --git a/Python/symtable.c b/Python/symtable.c
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -239,6 +239,7 @@
     asdl_seq *seq;
     int i;
     PyThreadState *tstate;
+    int recursion_limit = Py_GetRecursionLimit();
 
     if (st == NULL)
         return st;
@@ -251,8 +252,11 @@
         PySymtable_Free(st);
         return NULL;
     }
-    st->recursion_depth = tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE;
-    st->recursion_limit = Py_GetRecursionLimit() * COMPILER_STACK_FRAME_SCALE;
+    /* Be careful here to prevent overflow. */
+    st->recursion_depth = (tstate->recursion_depth < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
+        tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE : tstate->recursion_depth;
+    st->recursion_limit = (recursion_limit < INT_MAX / COMPILER_STACK_FRAME_SCALE) ?
+        recursion_limit * COMPILER_STACK_FRAME_SCALE : recursion_limit;
 
     /* Make the initial symbol information gathering pass */
     if (!GET_IDENTIFIER(top) ||

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list