[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