From: Nadeem Vawda Date: Sat, 11 Feb 2012 23:51:38 +0000 (+0200) Subject: Fix seekable() in BZ2File and LZMAFile to check whether the underlying file supports... X-Git-Tag: v3.3.0a1~202^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ae557d767fa0862188a17914eb07b74088ed4d29;p=thirdparty%2FPython%2Fcpython.git Fix seekable() in BZ2File and LZMAFile to check whether the underlying file supports seek(). --- diff --git a/Lib/bz2.py b/Lib/bz2.py index 7e1a7e29c663..51b9ac438856 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -138,7 +138,7 @@ class BZ2File(io.BufferedIOBase): def seekable(self): """Return whether the file supports seeking.""" - return self.readable() + return self.readable() and self._fp.seekable() def readable(self): """Return whether the file was opened for reading.""" @@ -165,9 +165,12 @@ class BZ2File(io.BufferedIOBase): raise io.UnsupportedOperation("File not open for writing") def _check_can_seek(self): - if not self.seekable(): + if not self.readable(): raise io.UnsupportedOperation("Seeking is only supported " "on files open for reading") + if not self._fp.seekable(): + raise io.UnsupportedOperation("The underlying file object " + "does not support seeking") # Fill the readahead buffer if it is empty. Returns False on EOF. def _fill_buffer(self): diff --git a/Lib/lzma.py b/Lib/lzma.py index 780c666eebf9..3786993ccff0 100644 --- a/Lib/lzma.py +++ b/Lib/lzma.py @@ -165,7 +165,7 @@ class LZMAFile(io.BufferedIOBase): def seekable(self): """Return whether the file supports seeking.""" - return self.readable() + return self.readable() and self._fp.seekable() def readable(self): """Return whether the file was opened for reading.""" @@ -192,9 +192,12 @@ class LZMAFile(io.BufferedIOBase): raise io.UnsupportedOperation("File not open for writing") def _check_can_seek(self): - if not self.seekable(): + if not self.readable(): raise io.UnsupportedOperation("Seeking is only supported " "on files open for reading") + if not self._fp.seekable(): + raise io.UnsupportedOperation("The underlying file object " + "does not support seeking") # Fill the readahead buffer if it is empty. Returns False on EOF. def _fill_buffer(self): diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index 0f8d14910f43..cc416ed301d1 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -372,6 +372,15 @@ class BZ2FileTest(BaseTest): bz2f.close() self.assertRaises(ValueError, bz2f.seekable) + src = BytesIO(self.DATA) + src.seekable = lambda: False + bz2f = BZ2File(fileobj=src) + try: + self.assertFalse(bz2f.seekable()) + finally: + bz2f.close() + self.assertRaises(ValueError, bz2f.seekable) + def testReadable(self): bz2f = BZ2File(fileobj=BytesIO(self.DATA)) try: diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py index 8d3df92aa9a7..ffde5574adbd 100644 --- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -525,6 +525,15 @@ class FileTestCase(unittest.TestCase): f.close() self.assertRaises(ValueError, f.seekable) + src = BytesIO(COMPRESSED_XZ) + src.seekable = lambda: False + f = LZMAFile(fileobj=src) + try: + self.assertFalse(f.seekable()) + finally: + f.close() + self.assertRaises(ValueError, f.seekable) + def test_readable(self): f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) try: