diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-07-16 22:44:53 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-07-16 22:44:53 (GMT) |
commit | 74a7fa66639bf7960916e2862140dd2546d3c0c8 (patch) | |
tree | 590666058246ce3f19b03fb11d08194d0b3d4d7b /Python/errors.c | |
parent | bdf630c4a7e01141b0253a19c6cfc05a2dfc4e1b (diff) | |
download | cpython-74a7fa66639bf7960916e2862140dd2546d3c0c8.zip cpython-74a7fa66639bf7960916e2862140dd2546d3c0c8.tar.gz cpython-74a7fa66639bf7960916e2862140dd2546d3c0c8.tar.bz2 |
Issue #18408: Fix PyErr_NormalizeException(), handle PyObject_IsSubclass() failure
PyObject_IsSubclass() can fail and raise a new exception!
Diffstat (limited to 'Python/errors.c')
-rw-r--r-- | Python/errors.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/Python/errors.c b/Python/errors.c index 34445b6..53dd9a9 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -227,12 +227,21 @@ PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) value will be an instance. */ if (PyExceptionClass_Check(type)) { + int is_subclass; + if (inclass) { + is_subclass = PyObject_IsSubclass(inclass, type); + if (is_subclass < 0) + goto finally; + } + else + is_subclass = 0; + /* if the value was not an instance, or is not an instance whose class is (or is derived from) type, then use the value as an argument to instantiation of the type class. */ - if (!inclass || !PyObject_IsSubclass(inclass, type)) { + if (!inclass || !is_subclass) { PyObject *args, *res; if (value == Py_None) |