mirror of
https://github.com/python/cpython.git
synced 2025-10-05 14:41:07 +00:00
[3.6] bpo-31588: Validate return value of __prepare__() methods (GH-3790)
Class execution requires that __prepare__() methods return
a proper execution namespace. Check for that immediately
after calling __prepare__(), rather than passing it through
to the code execution machinery and potentially triggering
SystemError (in debug builds) or a cryptic TypeError
(in release builds).
Patch by Oren Milman.
(cherry picked from commit 5837d0418f
)
This commit is contained in:
parent
fdcf3e9629
commit
084f80b82c
3 changed files with 31 additions and 0 deletions
|
@ -167,6 +167,13 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
Py_DECREF(bases);
|
||||
return NULL;
|
||||
}
|
||||
if (!PyMapping_Check(ns)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%.200s.__prepare__() must return a mapping, not %.200s",
|
||||
isclass ? ((PyTypeObject *)meta)->tp_name : "<metaclass>",
|
||||
Py_TYPE(ns)->tp_name);
|
||||
goto error;
|
||||
}
|
||||
cell = PyEval_EvalCodeEx(PyFunction_GET_CODE(func), PyFunction_GET_GLOBALS(func), ns,
|
||||
NULL, 0, NULL, 0, NULL, 0, NULL,
|
||||
PyFunction_GET_CLOSURE(func));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue