]> granicus.if.org Git - python/commitdiff
correctly handle invalid operations on streams (like writing on a non-writable one)
authorBenjamin Peterson <benjamin@python.org>
Thu, 14 May 2009 22:01:31 +0000 (22:01 +0000)
committerBenjamin Peterson <benjamin@python.org>
Thu, 14 May 2009 22:01:31 +0000 (22:01 +0000)
Lib/test/test_io.py
Modules/_io/textio.c

index 98dc71197b79d75a22fe4e6537aee3952013c827..08e0f1396f4edacdb4360ccc40249e9ef1965607 100644 (file)
@@ -290,6 +290,19 @@ class IOTest(unittest.TestCase):
         self.assertEqual(f.seek(-1, 2), self.LARGE)
         self.assertEqual(f.read(2), b"x")
 
+    def test_invalid_operations(self):
+        # Try writing on a file opened in read mode and vice-versa.
+        for mode in ("w", "wb"):
+            with open(support.TESTFN, mode) as fp:
+                self.assertRaises(IOError, fp.read)
+                self.assertRaises(IOError, fp.readline)
+        with open(support.TESTFN, "rb") as fp:
+            self.assertRaises(IOError, fp.write, b"blah")
+            self.assertRaises(IOError, fp.writelines, [b"blah\n"])
+        with open(support.TESTFN, "r") as fp:
+            self.assertRaises(IOError, fp.write, "blah")
+            self.assertRaises(IOError, fp.writelines, ["blah\n"])
+
     def test_raw_file_io(self):
         with self.open(support.TESTFN, "wb", buffering=0) as f:
             self.assertEqual(f.readable(), False)
index 8d2a686d80a86481bf1f0824bbc044712f8384bd..b78256e2ed69053e27bf8601f93a2ac773ba7273 100644 (file)
@@ -1228,6 +1228,11 @@ TextIOWrapper_write(PyTextIOWrapperObject *self, PyObject *args)
 
     CHECK_CLOSED(self);
 
+    if (self->encoder == NULL) {
+        PyErr_SetString(PyExc_IOError, "not writable");
+        return NULL;
+    }
+
     Py_INCREF(text);
 
     textlen = PyUnicode_GetSize(text);
@@ -1363,7 +1368,7 @@ TextIOWrapper_read_chunk(PyTextIOWrapperObject *self)
      */
 
     if (self->decoder == NULL) {
-        PyErr_SetString(PyExc_ValueError, "no decoder");
+        PyErr_SetString(PyExc_IOError, "not readable");
         return -1;
     }