mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
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 OConnor.
This commit is contained in:
commit
bf009f0bce
3 changed files with 15 additions and 0 deletions
|
|
@ -928,6 +928,14 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
|
||||||
finally:
|
finally:
|
||||||
support.unlink(support.TESTFN)
|
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):
|
def test_misbehaved_io(self):
|
||||||
rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg"))
|
rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg"))
|
||||||
bufio = self.tp(rawio)
|
bufio = self.tp(rawio)
|
||||||
|
|
|
||||||
|
|
@ -294,6 +294,10 @@ Core and Builtins
|
||||||
Library
|
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
|
- Issue #7689: Allow pickling of dynamically created classes when their
|
||||||
metaclass is registered with copyreg. Patch by Nicolas M. Thiéry and Craig
|
metaclass is registered with copyreg. Patch by Nicolas M. Thiéry and Craig
|
||||||
Citro.
|
Citro.
|
||||||
|
|
|
||||||
|
|
@ -1155,6 +1155,9 @@ buffered_seek(buffered *self, PyObject *args)
|
||||||
|
|
||||||
CHECK_CLOSED(self, "seek of closed file")
|
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);
|
target = PyNumber_AsOff_t(targetobj, PyExc_ValueError);
|
||||||
if (target == -1 && PyErr_Occurred())
|
if (target == -1 && PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue