diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-03-24 21:23:42 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-03-24 21:23:42 (GMT) |
commit | f95a57f9a19a4e593e87f34a5358372d5b6d08e8 (patch) | |
tree | faa1442f8ce9b4f567c5cae0e19a4489a5666249 /Modules | |
parent | 40fd0e8d68352f9d28be2a6ad1d6d0ba93756dbf (diff) | |
download | cpython-f95a57f9a19a4e593e87f34a5358372d5b6d08e8.zip cpython-f95a57f9a19a4e593e87f34a5358372d5b6d08e8.tar.gz cpython-f95a57f9a19a4e593e87f34a5358372d5b6d08e8.tar.bz2 |
Issue #21802: The reader in BufferedRWPair now is closed even when closing
writer failed in BufferedRWPair.close().
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_io/bufferedio.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 28c4678..f146958 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2200,12 +2200,25 @@ bufferedrwpair_writable(rwpair *self, PyObject *args) static PyObject * bufferedrwpair_close(rwpair *self, PyObject *args) { + PyObject *exc = NULL, *val, *tb; PyObject *ret = _forward_call(self->writer, "close", args); if (ret == NULL) - return NULL; - Py_DECREF(ret); - - return _forward_call(self->reader, "close", args); + PyErr_Fetch(&exc, &val, &tb); + else + Py_DECREF(ret); + ret = _forward_call(self->reader, "close", args); + if (exc != NULL) { + if (ret != NULL) { + Py_CLEAR(ret); + PyErr_Restore(exc, val, tb); + } + else { + Py_DECREF(exc); + Py_XDECREF(val); + Py_XDECREF(tb); + } + } + return ret; } static PyObject * |