mirror of
https://github.com/python/cpython
synced 2024-09-05 08:17:45 +00:00
bpo-43660: Fix crash when displaying exceptions with custom values for sys.stderr (GH-25075)
This commit is contained in:
parent
c8b5738810
commit
09b90a037d
|
@ -1512,6 +1512,21 @@ def test_asyncgen_hooks(self):
|
|||
self.assertIsNone(cur.firstiter)
|
||||
self.assertIsNone(cur.finalizer)
|
||||
|
||||
def test_changing_sys_stderr_and_removing_reference(self):
|
||||
# If the default displayhook doesn't take a strong reference
|
||||
# to sys.stderr the following code can crash. See bpo-43660
|
||||
# for more details.
|
||||
code = textwrap.dedent('''
|
||||
import sys
|
||||
class MyStderr:
|
||||
def write(self, s):
|
||||
sys.stderr = None
|
||||
sys.stderr = MyStderr()
|
||||
1/0
|
||||
''')
|
||||
rc, out, err = assert_python_failure('-c', code)
|
||||
self.assertEqual(out, b"")
|
||||
self.assertEqual(err, b"")
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
Fix crash that happens when replacing ``sys.stderr`` with a callable that
|
||||
can remove the object while an exception is being printed. Patch by Pablo
|
||||
Galindo.
|
|
@ -1082,8 +1082,9 @@ PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
|
|||
if (file == Py_None) {
|
||||
return;
|
||||
}
|
||||
|
||||
Py_INCREF(file);
|
||||
_PyErr_Display(file, exception, value, tb);
|
||||
Py_DECREF(file);
|
||||
}
|
||||
|
||||
PyObject *
|
||||
|
|
Loading…
Reference in a new issue