Skip to content

Commit 91a7a5e

Browse files
committed
Don't crash in eval()/exec() on hydrated code with free vars
1 parent fecfe17 commit 91a7a5e

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

Python/bltinmodule.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <ctype.h>
55
#include "pycore_ast.h" // _PyAST_Validate()
66
#include "pycore_compile.h" // _PyAST_Compile()
7+
#include "pycore_code.h" // Hydration
78
#include "pycore_object.h" // _Py_AddToAllObjects()
89
#include "pycore_pyerrors.h" // _PyErr_NoMemory()
910
#include "pycore_pystate.h" // _PyThreadState_GET()
@@ -967,8 +968,13 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals,
967968
if (PySys_Audit("exec", "O", source) < 0) {
968969
return NULL;
969970
}
970-
971-
if (PyCode_GetNumFree((PyCodeObject *)source) > 0) {
971+
PyCodeObject *code = (PyCodeObject *)source;
972+
if (!_PyCode_IsHydrated(code)) {
973+
if (!_PyCode_Hydrate(code)) {
974+
return NULL;
975+
}
976+
}
977+
if (PyCode_GetNumFree(code) > 0) {
972978
PyErr_SetString(PyExc_TypeError,
973979
"code object passed to eval() may not contain free variables");
974980
return NULL;
@@ -1055,8 +1061,13 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals,
10551061
if (PySys_Audit("exec", "O", source) < 0) {
10561062
return NULL;
10571063
}
1058-
1059-
if (PyCode_GetNumFree((PyCodeObject *)source) > 0) {
1064+
PyCodeObject *code = (PyCodeObject *)source;
1065+
if (!_PyCode_IsHydrated(code)) {
1066+
if (!_PyCode_Hydrate(code)) {
1067+
return NULL;
1068+
}
1069+
}
1070+
if (PyCode_GetNumFree(code) > 0) {
10601071
PyErr_SetString(PyExc_TypeError,
10611072
"code object passed to exec() may not "
10621073
"contain free variables");

0 commit comments

Comments
 (0)