diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-07 22:24:20 +0300 |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-07 22:24:20 +0300 |
commit | 242c170f878cc38eb32b26b55f69a9d7cef947a7 (patch) | |
tree | 63fb8c5585cf916b4936885f2be87ea2b458833a /Lib/zipfile.py | |
parent | 5e80855af3537f9715b33539d5b9860ca533a288 (diff) | |
parent | 8793b215253bf69cc699fab77b12d7f1313360d8 (diff) | |
download | cpython-git-242c170f878cc38eb32b26b55f69a9d7cef947a7.tar.gz |
Issue #26293: Fixed writing ZIP files that starts not from the start of the
file. Offsets in ZIP file now are relative to the start of the archive in
conforming to the specification.
Diffstat (limited to 'Lib/zipfile.py')
-rw-r--r-- | Lib/zipfile.py | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 7ba4e5980b..e2ae042cfd 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1103,10 +1103,10 @@ class ZipFile: # even if no files are added to the archive self._didModify = True try: - self.start_dir = self.fp.tell() + self.start_dir = self._start_disk = self.fp.tell() except (AttributeError, OSError): self.fp = _Tellable(self.fp) - self.start_dir = 0 + self.start_dir = self._start_disk = 0 self._seekable = False else: # Some file-like objects can provide tell() but not seek() @@ -1127,7 +1127,7 @@ class ZipFile: # set the modified flag so central directory gets written # even if no files are added to the archive self._didModify = True - self.start_dir = self.fp.tell() + self.start_dir = self._start_disk = self.fp.tell() else: raise ValueError("Mode must be 'r', 'w', 'x', or 'a'") except: @@ -1171,17 +1171,18 @@ class ZipFile: offset_cd = endrec[_ECD_OFFSET] # offset of central directory self._comment = endrec[_ECD_COMMENT] # archive comment - # "concat" is zero, unless zip was concatenated to another file - concat = endrec[_ECD_LOCATION] - size_cd - offset_cd + # self._start_disk: Position of the start of ZIP archive + # It is zero, unless ZIP was concatenated to another file + self._start_disk = endrec[_ECD_LOCATION] - size_cd - offset_cd if endrec[_ECD_SIGNATURE] == stringEndArchive64: # If Zip64 extension structures are present, account for them - concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator) + self._start_disk -= (sizeEndCentDir64 + sizeEndCentDir64Locator) if self.debug > 2: - inferred = concat + offset_cd - print("given, inferred, offset", offset_cd, inferred, concat) + inferred = self._start_disk + offset_cd + print("given, inferred, offset", offset_cd, inferred, self._start_disk) # self.start_dir: Position of start of central directory - self.start_dir = offset_cd + concat + self.start_dir = offset_cd + self._start_disk fp.seek(self.start_dir, 0) data = fp.read(size_cd) fp = io.BytesIO(data) @@ -1221,7 +1222,7 @@ class ZipFile: t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) x._decodeExtra() - x.header_offset = x.header_offset + concat + x.header_offset = x.header_offset + self._start_disk self.filelist.append(x) self.NameToInfo[x.filename] = x @@ -1685,11 +1686,10 @@ class ZipFile: file_size = zinfo.file_size compress_size = zinfo.compress_size - if zinfo.header_offset > ZIP64_LIMIT: - extra.append(zinfo.header_offset) + header_offset = zinfo.header_offset - self._start_disk + if header_offset > ZIP64_LIMIT: + extra.append(header_offset) header_offset = 0xffffffff - else: - header_offset = zinfo.header_offset extra_data = zinfo.extra min_version = 0 @@ -1736,7 +1736,7 @@ class ZipFile: # Write end-of-zip-archive record centDirCount = len(self.filelist) centDirSize = pos2 - self.start_dir - centDirOffset = self.start_dir + centDirOffset = self.start_dir - self._start_disk requires_zip64 = None if centDirCount > ZIP_FILECOUNT_LIMIT: requires_zip64 = "Files count" |