Commit 81971eaf authored by Benjamin Peterson's avatar Benjamin Peterson

correctly handle invalid operations on streams (like writing on a non-writable one)

parent 37d1c18b
...@@ -290,6 +290,19 @@ class IOTest(unittest.TestCase): ...@@ -290,6 +290,19 @@ class IOTest(unittest.TestCase):
self.assertEqual(f.seek(-1, 2), self.LARGE) self.assertEqual(f.seek(-1, 2), self.LARGE)
self.assertEqual(f.read(2), b"x") 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): def test_raw_file_io(self):
with self.open(support.TESTFN, "wb", buffering=0) as f: with self.open(support.TESTFN, "wb", buffering=0) as f:
self.assertEqual(f.readable(), False) self.assertEqual(f.readable(), False)
......
...@@ -1228,6 +1228,11 @@ TextIOWrapper_write(PyTextIOWrapperObject *self, PyObject *args) ...@@ -1228,6 +1228,11 @@ TextIOWrapper_write(PyTextIOWrapperObject *self, PyObject *args)
CHECK_CLOSED(self); CHECK_CLOSED(self);
if (self->encoder == NULL) {
PyErr_SetString(PyExc_IOError, "not writable");
return NULL;
}
Py_INCREF(text); Py_INCREF(text);
textlen = PyUnicode_GetSize(text); textlen = PyUnicode_GetSize(text);
...@@ -1363,7 +1368,7 @@ TextIOWrapper_read_chunk(PyTextIOWrapperObject *self) ...@@ -1363,7 +1368,7 @@ TextIOWrapper_read_chunk(PyTextIOWrapperObject *self)
*/ */
if (self->decoder == NULL) { if (self->decoder == NULL) {
PyErr_SetString(PyExc_ValueError, "no decoder"); PyErr_SetString(PyExc_IOError, "not readable");
return -1; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment