summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2009-03-31 23:11:32 (GMT)
committerBenjamin Peterson <benjamin@python.org>2009-03-31 23:11:32 (GMT)
commita1b49013f477e83bd1652f651f35c2e4eea54b67 (patch)
treee56aaae216ffdb72108a7131de3f2dd38ddc8244
parentd2ee64d9dd62942488a2f7fff18a21b87da7f7a9 (diff)
downloadcpython-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.py1
-rw-r--r--Lib/test/test_io.py7
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/_textio.c5
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 = ""
diff --git a/Misc/NEWS b/Misc/NEWS
index 78adb64..914e257 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 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;