]> granicus.if.org Git - python/commitdiff
fix TextIOWrapper.read() when the buffer is not readable #5628
authorBenjamin Peterson <benjamin@python.org>
Tue, 31 Mar 2009 23:11:32 +0000 (23:11 +0000)
committerBenjamin Peterson <benjamin@python.org>
Tue, 31 Mar 2009 23:11:32 +0000 (23:11 +0000)
Lib/_pyio.py
Lib/test/test_io.py
Misc/NEWS
Modules/_textio.c

index 654a69cd0173c684eb7668d95044ad726d7093ca..334c2b7e05f9f4cc0d33b5bb9791ae5505f869b1 100644 (file)
@@ -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()
index d5be405ef517005c7cf73431805ecbea8972cf90..53017f352a8f7922d6005cbac7c0f335757208fc 100644 (file)
@@ -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 = ""
index 78adb643225ee2b2d76902045c9dd1b55b673c33..914e257a885038c00ef31f2105b06e1c738e4dec 100644 (file)
--- 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.
 
index dbfc8ae30cea2e69304e9dee80280d23eaf8976d..cc229a8562f679d6522f812ad38420ff5e7be3f7 100644 (file)
@@ -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;