diff -r 75a146a657d9 Lib/test/test_zipimport.py --- a/Lib/test/test_zipimport.py Sat Nov 24 18:14:12 2012 +0100 +++ b/Lib/test/test_zipimport.py Sun Nov 25 16:18:30 2012 +0100 @@ -196,6 +196,7 @@ for name, (mtime, data) in files.items(): zinfo = ZipInfo(name, time.localtime(mtime)) zinfo.compress_type = self.compression + zinfo.comment = b"spam" z.writestr(zinfo, data) z.close() @@ -245,6 +246,7 @@ for name, (mtime, data) in files.items(): zinfo = ZipInfo(name, time.localtime(mtime)) zinfo.compress_type = self.compression + zinfo.comment = b"eggs" z.writestr(zinfo, data) z.close() diff -r 75a146a657d9 Modules/zipimport.c --- a/Modules/zipimport.c Sat Nov 24 18:14:12 2012 +0100 +++ b/Modules/zipimport.c Sun Nov 25 16:18:30 2012 +0100 @@ -861,7 +861,7 @@ Py_ssize_t file_offset, header_position, header_offset; long l, count; Py_ssize_t i; - char name[MAXPATHLEN + 5]; + char name[MAXPATHLEN + 5], dummy[8]; PyObject *nameobj = NULL; char *p, endof_central_dir[22]; Py_ssize_t arc_offset; /* Absolute offset to start of the zip-archive. */ @@ -905,17 +905,20 @@ /* Start of Central Directory */ count = 0; + if (fseek(fp, header_offset, 0) == -1) + goto file_error; for (;;) { PyObject *t; int err; - if (fseek(fp, header_offset, 0) == -1) /* Start of file header */ - goto fseek_error; + /* Start of file header */ l = PyMarshal_ReadLongFromFile(fp); if (l != 0x02014B50) break; /* Bad: Central Dir File Header */ - if (fseek(fp, header_offset + 8, 0) == -1) - goto fseek_error; + + if (fread(dummy, 1, 4, fp) != 4) /* dummy read for unused fields */ + goto file_error; + flags = (unsigned short)PyMarshal_ReadShortFromFile(fp); compress = PyMarshal_ReadShortFromFile(fp); time = PyMarshal_ReadShortFromFile(fp); @@ -924,11 +927,11 @@ data_size = PyMarshal_ReadLongFromFile(fp); file_size = PyMarshal_ReadLongFromFile(fp); name_size = PyMarshal_ReadShortFromFile(fp); - header_size = 46 + name_size + + header_size = name_size + PyMarshal_ReadShortFromFile(fp) + PyMarshal_ReadShortFromFile(fp); - if (fseek(fp, header_offset + 42, 0) == -1) - goto fseek_error; + if (fread(dummy, 1, 8, fp) != 8) /* dummy read for unused fields */ + goto file_error; file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset; if (name_size > MAXPATHLEN) name_size = MAXPATHLEN; @@ -941,7 +944,8 @@ p++; } *p = 0; /* Add terminating null byte */ - header_offset += header_size; + for (; i < header_size; i++) + (void)getc(fp); bootstrap = 0; if (flags & 0x0800) @@ -988,7 +992,7 @@ PySys_FormatStderr("# zipimport: found %ld names in %R\n", count, archive); return files; -fseek_error: +file_error: fclose(fp); Py_XDECREF(files); Py_XDECREF(nameobj);