diff -r a70ca6f35327 Lib/test/test_io.py --- a/Lib/test/test_io.py Mon Mar 30 11:48:50 2015 -0400 +++ b/Lib/test/test_io.py Wed Apr 01 13:48:32 2015 -0400 @@ -1179,6 +1179,14 @@ self.assertEqual(rawio._extraneous_reads, 0, "failed for {}: {} != 0".format(n, rawio._extraneous_reads)) + def test_read_on_closed(self): + # Issue #23796 + b = io.BufferedReader(io.BytesIO(b"12")) + b.read(1) + b.close() + self.assertRaises(ValueError, b.peek) + self.assertRaises(ValueError, b.read1, 1) + class CBufferedReaderTest(BufferedReaderTest, SizeofTest): tp = io.BufferedReader diff -r a70ca6f35327 Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c Mon Mar 30 11:48:50 2015 -0400 +++ b/Modules/_io/bufferedio.c Wed Apr 01 13:48:32 2015 -0400 @@ -882,6 +882,7 @@ PyObject *res = NULL; CHECK_INITIALIZED(self) + CHECK_CLOSED(self, "peek of closed file") if (!PyArg_ParseTuple(args, "|n:peek", &n)) { return NULL; } @@ -956,6 +957,9 @@ "read length must be positive"); return NULL; } + + CHECK_CLOSED(self, "read of closed file") + if (n == 0) return PyBytes_FromStringAndSize(NULL, 0);