diff options
author | Oren Milman <orenmn@gmail.com> | 2017-09-27 14:04:37 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2017-09-27 14:04:37 (GMT) |
commit | 5837d0418f47933b2e3c139bdee8a79c248a943c (patch) | |
tree | a3b7dfdca108fe5b67d63a878f85c2b829f4fe41 /Python | |
parent | 236329ed9fee01edb85d698d30682e304439d198 (diff) | |
download | cpython-5837d0418f47933b2e3c139bdee8a79c248a943c.zip cpython-5837d0418f47933b2e3c139bdee8a79c248a943c.tar.gz cpython-5837d0418f47933b2e3c139bdee8a79c248a943c.tar.bz2 |
bpo-31588: Validate return value of __prepare__() methods (GH-3764)
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.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bltinmodule.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index c363cfe..2269fe2 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -157,6 +157,13 @@ builtin___build_class__(PyObject *self, PyObject **args, Py_ssize_t nargs, 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)); |