From a1b49013f477e83bd1652f651f35c2e4eea54b67 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 31 Mar 2009 23:11:32 +0000 Subject: [PATCH] fix TextIOWrapper.read() when the buffer is not readable #5628 --- Lib/_pyio.py | 1 + Lib/test/test_io.py | 7 +++++++ Misc/NEWS | 2 ++ Modules/_textio.c | 5 +++++ 4 files changed, 15 insertions(+) diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 654a69cd017..334c2b7e05f 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1696,6 +1696,7 @@ class TextIOWrapper(TextIOBase): return cookie def read(self, n=None): + self._checkReadable() if n is None: n = -1 decoder = self._decoder or self._get_decoder() diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index d5be405ef51..53017f352a8 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -1754,6 +1754,13 @@ class TextIOWrapperTest(unittest.TestCase): self.assertEquals(f.read(), data * 2) self.assertEquals(buf.getvalue(), (data * 2).encode(encoding)) + def test_unreadable(self): + class UnReadable(self.BytesIO): + def readable(self): + return False + txt = self.TextIOWrapper(UnReadable()) + self.assertRaises(IOError, txt.read) + def test_read_one_by_one(self): txt = self.TextIOWrapper(self.BytesIO(b"AA\r\nBB")) reads = "" diff --git a/Misc/NEWS b/Misc/NEWS index 78adb643225..914e257a885 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -53,6 +53,8 @@ Core and Builtins Library ------- +- Issue #5628: Fix io.TextIOWrapper.read() with a unreadable buffer. + - Issue #5619: Multiprocessing children disobey the debug flag and causes popups on windows buildbots. Patch applied to work around this issue. diff --git a/Modules/_textio.c b/Modules/_textio.c index dbfc8ae30ce..cc229a8562f 100644 --- a/Modules/_textio.c +++ b/Modules/_textio.c @@ -1348,6 +1348,11 @@ TextIOWrapper_read(PyTextIOWrapperObject *self, PyObject *args) CHECK_CLOSED(self); + if (self->decoder == NULL) { + PyErr_SetString(PyExc_IOError, "not readable"); + return NULL; + } + if (_TextIOWrapper_writeflush(self) < 0) return NULL;