summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-03-24 21:23:42 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-03-24 21:23:42 (GMT)
commitf95a57f9a19a4e593e87f34a5358372d5b6d08e8 (patch)
treefaa1442f8ce9b4f567c5cae0e19a4489a5666249 /Modules
parent40fd0e8d68352f9d28be2a6ad1d6d0ba93756dbf (diff)
downloadcpython-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.c21
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 *