mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-140530: fix a reference leak in an error path for raise exc from cause (#140908)
Fix a reference leak in `raise E from T` when `T` is an exception subtype for which `T.__new__` does not return an exception instance.
This commit is contained in:
parent
5ba0a1aa1f
commit
0c77e7c23b
3 changed files with 10 additions and 11 deletions
|
|
@ -186,18 +186,14 @@ def test_class_cause(self):
|
||||||
self.fail("No exception raised")
|
self.fail("No exception raised")
|
||||||
|
|
||||||
def test_class_cause_nonexception_result(self):
|
def test_class_cause_nonexception_result(self):
|
||||||
class ConstructsNone(BaseException):
|
# See https://github.com/python/cpython/issues/140530.
|
||||||
@classmethod
|
class ConstructMortal(BaseException):
|
||||||
def __new__(*args, **kwargs):
|
def __new__(*args, **kwargs):
|
||||||
return None
|
return ["mortal value"]
|
||||||
try:
|
|
||||||
raise IndexError from ConstructsNone
|
msg = ".*should have returned an instance of BaseException.*"
|
||||||
except TypeError as e:
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
self.assertIn("should have returned an instance of BaseException", str(e))
|
raise IndexError from ConstructMortal
|
||||||
except IndexError:
|
|
||||||
self.fail("Wrong kind of exception raised")
|
|
||||||
else:
|
|
||||||
self.fail("No exception raised")
|
|
||||||
|
|
||||||
def test_instance_cause(self):
|
def test_instance_cause(self):
|
||||||
cause = KeyError()
|
cause = KeyError()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix a reference leak when ``raise exc from cause`` fails. Patch by Bénédikt
|
||||||
|
Tran.
|
||||||
|
|
@ -2148,6 +2148,7 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
|
||||||
"calling %R should have returned an instance of "
|
"calling %R should have returned an instance of "
|
||||||
"BaseException, not %R",
|
"BaseException, not %R",
|
||||||
cause, Py_TYPE(fixed_cause));
|
cause, Py_TYPE(fixed_cause));
|
||||||
|
Py_DECREF(fixed_cause);
|
||||||
goto raise_error;
|
goto raise_error;
|
||||||
}
|
}
|
||||||
Py_DECREF(cause);
|
Py_DECREF(cause);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue