diff options
author | Benjamin Peterson <benjamin@python.org> | 2009-03-31 23:11:32 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2009-03-31 23:11:32 (GMT) |
commit | a1b49013f477e83bd1652f651f35c2e4eea54b67 (patch) | |
tree | e56aaae216ffdb72108a7131de3f2dd38ddc8244 | |
parent | d2ee64d9dd62942488a2f7fff18a21b87da7f7a9 (diff) | |
download | cpython-a1b49013f477e83bd1652f651f35c2e4eea54b67.zip cpython-a1b49013f477e83bd1652f651f35c2e4eea54b67.tar.gz cpython-a1b49013f477e83bd1652f651f35c2e4eea54b67.tar.bz2 |
fix TextIOWrapper.read() when the buffer is not readable #5628
-rw-r--r-- | Lib/_pyio.py | 1 | ||||
-rw-r--r-- | Lib/test/test_io.py | 7 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/_textio.c | 5 |
4 files changed, 15 insertions, 0 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 654a69c..334c2b7 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 d5be405..53017f3 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 = "" @@ -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 dbfc8ae..cc229a8 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; |