bpo-34035: Fix several AttributeError in zipfile seek() methods. (GH-8527)

This commit is contained in:
Mickaël Schoentgen 2018-07-29 20:26:52 +02:00 committed by Serhiy Storchaka
parent d2e902e4fb
commit 3f8c6913b8
4 changed files with 9 additions and 4 deletions

View file

@ -1646,6 +1646,8 @@ class OtherTests(unittest.TestCase):
self.assertEqual(fp.read(5), txt[bloc:bloc+5]) self.assertEqual(fp.read(5), txt[bloc:bloc+5])
fp.seek(0, os.SEEK_END) fp.seek(0, os.SEEK_END)
self.assertEqual(fp.tell(), len(txt)) self.assertEqual(fp.tell(), len(txt))
fp.seek(0, os.SEEK_SET)
self.assertEqual(fp.tell(), 0)
# Check seek on memory file # Check seek on memory file
data = io.BytesIO() data = io.BytesIO()
with zipfile.ZipFile(data, mode="w") as zipf: with zipfile.ZipFile(data, mode="w") as zipf:
@ -1661,6 +1663,8 @@ class OtherTests(unittest.TestCase):
self.assertEqual(fp.read(5), txt[bloc:bloc+5]) self.assertEqual(fp.read(5), txt[bloc:bloc+5])
fp.seek(0, os.SEEK_END) fp.seek(0, os.SEEK_END)
self.assertEqual(fp.tell(), len(txt)) self.assertEqual(fp.tell(), len(txt))
fp.seek(0, os.SEEK_SET)
self.assertEqual(fp.tell(), 0)
def tearDown(self): def tearDown(self):
unlink(TESTFN) unlink(TESTFN)

View file

@ -701,11 +701,11 @@ class _SharedFile:
def seek(self, offset, whence=0): def seek(self, offset, whence=0):
with self._lock: with self._lock:
if self.writing(): if self._writing():
raise ValueError("Can't reposition in the ZIP file while " raise ValueError("Can't reposition in the ZIP file while "
"there is an open writing handle on it. " "there is an open writing handle on it. "
"Close the writing handle before trying to read.") "Close the writing handle before trying to read.")
self._file.seek(self._pos) self._file.seek(offset, whence)
self._pos = self._file.tell() self._pos = self._file.tell()
return self._pos return self._pos
@ -1021,14 +1021,13 @@ class ZipExtFile(io.BufferedIOBase):
read_offset = 0 read_offset = 0
elif read_offset < 0: elif read_offset < 0:
# Position is before the current position. Reset the ZipExtFile # Position is before the current position. Reset the ZipExtFile
self._fileobj.seek(self._orig_compress_start) self._fileobj.seek(self._orig_compress_start)
self._running_crc = self._orig_start_crc self._running_crc = self._orig_start_crc
self._compress_left = self._orig_compress_size self._compress_left = self._orig_compress_size
self._left = self._orig_file_size self._left = self._orig_file_size
self._readbuffer = b'' self._readbuffer = b''
self._offset = 0 self._offset = 0
self._decompressor = zipfile._get_decompressor(self._compress_type) self._decompressor = _get_decompressor(self._compress_type)
self._eof = False self._eof = False
read_offset = new_pos read_offset = new_pos

View file

@ -1435,6 +1435,7 @@ Michael Schneider
Peter Schneider-Kamp Peter Schneider-Kamp
Arvin Schnell Arvin Schnell
Nofar Schnider Nofar Schnider
Mickaël Schoentgen
Ed Schouten Ed Schouten
Scott Schram Scott Schram
Robin Schreiber Robin Schreiber

View file

@ -0,0 +1 @@
Fix several AttributeError in zipfile seek() methods. Patch by Mickaël Schoentgen.