mirror of https://github.com/python/cpython.git
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.firstiter)
|
||||||
self.assertIsNone(cur.finalizer)
|
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__":
|
if __name__ == "__main__":
|
||||||
unittest.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) {
|
if (file == Py_None) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Py_INCREF(file);
|
||||||
_PyErr_Display(file, exception, value, tb);
|
_PyErr_Display(file, exception, value, tb);
|
||||||
|
Py_DECREF(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
|
|
Loading…
Reference in New Issue