diff options
author | Gregory P. Smith <greg@krypto.org> | 2012-11-11 01:41:49 -0800 |
---|---|---|
committer | Gregory P. Smith <greg@krypto.org> | 2012-11-11 01:41:49 -0800 |
commit | eee60eb83f2c2565d8f4def6e60bf1ecfcf36584 (patch) | |
tree | 96d8eee40eaa7ee6b0c34b616fea24bfe37ed3e1 /Python/errors.c | |
parent | f5a10551eefa79ea3e832d7ac757d9514164a319 (diff) | |
parent | 4944557bb395eceb7eb1d69490ce0ea2826731c6 (diff) | |
download | cpython-eee60eb83f2c2565d8f4def6e60bf1ecfcf36584.tar.gz |
Fixes issue #16140: The subprocess module no longer double closes its
child subprocess.PIPE parent file descriptors on child error prior to
exec().
This would lead to race conditions in multithreaded programs where
another thread opened a file reusing the fd which was then closed out
from beneath it by the errant second close.
Diffstat (limited to 'Python/errors.c')
-rw-r--r-- | Python/errors.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/Python/errors.c b/Python/errors.c index 626b16e46f..a2d1a82ddf 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -798,7 +798,12 @@ PyErr_WriteUnraisable(PyObject *obj) PyErr_Fetch(&t, &v, &tb); f = PySys_GetObject("stderr"); if (f != NULL && f != Py_None) { - PyFile_WriteString("Exception ", f); + if (obj) { + PyFile_WriteString("Exception ignored in: ", f); + PyFile_WriteObject(obj, f, 0); + PyFile_WriteString("\n", f); + } + PyTraceBack_Print(tb, f); if (t) { PyObject* moduleName; char* className; @@ -828,15 +833,11 @@ PyErr_WriteUnraisable(PyObject *obj) PyFile_WriteString(className, f); if (v && v != Py_None) { PyFile_WriteString(": ", f); - PyFile_WriteObject(v, f, 0); + PyFile_WriteObject(v, f, Py_PRINT_RAW); } + PyFile_WriteString("\n", f); Py_XDECREF(moduleName); } - if (obj) { - PyFile_WriteString(" in ", f); - PyFile_WriteObject(obj, f, 0); - } - PyFile_WriteString(" ignored\n", f); PyErr_Clear(); /* Just in case */ } Py_XDECREF(t); |