summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_io.py8
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/_io/bufferedio.c3
3 files changed, 15 insertions, 0 deletions
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 117f8ab..455eda3 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -928,6 +928,14 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
finally:
support.unlink(support.TESTFN)
+ def test_unseekable(self):
+ bufio = self.tp(self.MockUnseekableIO(b"A" * 10))
+ self.assertRaises(self.UnsupportedOperation, bufio.tell)
+ self.assertRaises(self.UnsupportedOperation, bufio.seek, 0)
+ bufio.read(1)
+ self.assertRaises(self.UnsupportedOperation, bufio.seek, 0)
+ self.assertRaises(self.UnsupportedOperation, bufio.tell)
+
def test_misbehaved_io(self):
rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg"))
bufio = self.tp(rawio)
diff --git a/Misc/NEWS b/Misc/NEWS
index 35dac45..6752d9e 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -294,6 +294,10 @@ Core and Builtins
Library
-------
+- Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation
+ if the underlying raw stream is unseekable, even if the seek could be
+ satisfied using the internal buffer. Patch by John O'Connor.
+
- Issue #7689: Allow pickling of dynamically created classes when their
metaclass is registered with copyreg. Patch by Nicolas M. ThiƩry and Craig
Citro.
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index a8631e0..b8043d4 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -1155,6 +1155,9 @@ buffered_seek(buffered *self, PyObject *args)
CHECK_CLOSED(self, "seek of closed file")
+ if (_PyIOBase_check_seekable(self->raw, Py_True) == NULL)
+ return NULL;
+
target = PyNumber_AsOff_t(targetobj, PyExc_ValueError);
if (target == -1 && PyErr_Occurred())
return NULL;