Commit 43a72737 authored by Benjamin Peterson's avatar Benjamin Peterson

don't scale compiler stack frames if the recursion limit is huge (closes #19098)

parent 54be359e
...@@ -12,6 +12,9 @@ What's New in Python 3.3.3 release candidate 1? ...@@ -12,6 +12,9 @@ What's New in Python 3.3.3 release candidate 1?
Core and Builtins 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 #18942: sys._debugmallocstats() output was damaged on Windows.
- Issue #18667: Add missing "HAVE_FCHOWNAT" symbol to posix._have_functions. - Issue #18667: Add missing "HAVE_FCHOWNAT" symbol to posix._have_functions.
......
...@@ -239,6 +239,7 @@ PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) ...@@ -239,6 +239,7 @@ PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
asdl_seq *seq; asdl_seq *seq;
int i; int i;
PyThreadState *tstate; PyThreadState *tstate;
int recursion_limit = Py_GetRecursionLimit();
if (st == NULL) if (st == NULL)
return st; return st;
...@@ -251,8 +252,11 @@ PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) ...@@ -251,8 +252,11 @@ PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future)
PySymtable_Free(st); PySymtable_Free(st);
return NULL; return NULL;
} }
st->recursion_depth = tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE; /* Be careful here to prevent overflow. */
st->recursion_limit = Py_GetRecursionLimit() * COMPILER_STACK_FRAME_SCALE; 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 */ /* Make the initial symbol information gathering pass */
if (!GET_IDENTIFIER(top) || if (!GET_IDENTIFIER(top) ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment