summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-07-16 22:44:53 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-07-16 22:44:53 (GMT)
commit74a7fa66639bf7960916e2862140dd2546d3c0c8 (patch)
tree590666058246ce3f19b03fb11d08194d0b3d4d7b
parentbdf630c4a7e01141b0253a19c6cfc05a2dfc4e1b (diff)
downloadcpython-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!
-rw-r--r--Python/errors.c11
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)