diff --git a/pisi/archive.py b/pisi/archive.py index a0b5db48..574228d3 100644 --- a/pisi/archive.py +++ b/pisi/archive.py @@ -19,6 +19,7 @@ import shutil import tarfile import zipfile import gzip +import struct import gettext __trans = gettext.translation('pisi', fallback=True) @@ -212,7 +213,23 @@ class MyZipFile(zipfile.ZipFile): "Attempt to read ZIP archive that was already closed" zinfo = self.getinfo(name) filepos = self.fp.tell() - self.fp.seek(zinfo.file_offset, 0) + + self.fp.seek(zinfo.header_offset, 0) + + # Skip the file header: + fheader = self.fp.read(30) + if fheader[0:4] != zipfile.stringFileHeader: + raise BadZipfile, "Bad magic number for file header" + + fheader = struct.unpack(zipfile.structFileHeader, fheader) + fname = self.fp.read(fheader[zipfile._FH_FILENAME_LENGTH]) + if fheader[zipfile._FH_EXTRA_FIELD_LENGTH]: + self.fp.read(fheader[zipfile._FH_EXTRA_FIELD_LENGTH]) + + if fname != zinfo.orig_filename: + raise zipfile.BadZipfile, \ + 'File name in directory "%s" and header "%s" differ.' % ( + zinfo.orig_filename, fname) destfile = file(outname, 'wb')