Kaydet (Commit) c30d0585 authored tarafından Benjamin Peterson's avatar Benjamin Peterson

merge 3.3 (#19098)

...@@ -9,6 +9,9 @@ Core and Builtins ...@@ -9,6 +9,9 @@ Core and Builtins
- Issue #18818: The "encodingname" part of PYTHONIOENCODING is now optional. - Issue #18818: The "encodingname" part of PYTHONIOENCODING is now optional.
- Issue #19098: Prevent overflow in the compiler when the recursion limit is set
absurbly high.
Library Library
------- -------
......
...@@ -239,6 +239,7 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) ...@@ -239,6 +239,7 @@ PySymtable_BuildObject(mod_ty mod, PyObject *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 NULL; return NULL;
...@@ -256,8 +257,11 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) ...@@ -256,8 +257,11 @@ PySymtable_BuildObject(mod_ty mod, PyObject *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