summaryrefslogtreecommitdiffstats
path: root/Modules/zipimport.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/zipimport.c')
-rw-r--r--Modules/zipimport.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/Modules/zipimport.c b/Modules/zipimport.c
index 1c95d5a..afcd421 100644
--- a/Modules/zipimport.c
+++ b/Modules/zipimport.c
@@ -655,11 +655,12 @@ read_directory(char *archive)
PyObject *files = NULL;
FILE *fp;
long compress, crc, data_size, file_size, file_offset, date, time;
- long header_offset, name_size, header_size;
+ long header_offset, name_size, header_size, header_position;
long i, l, length, count;
char path[MAXPATHLEN + 5];
char name[MAXPATHLEN + 5];
char *p, endof_central_dir[22];
+ long arc_offset; /* offset from beginning of file to start of zip-archive */
if (strlen(archive) > MAXPATHLEN) {
PyErr_SetString(PyExc_OverflowError,
@@ -675,6 +676,7 @@ read_directory(char *archive)
return NULL;
}
fseek(fp, -22, SEEK_END);
+ header_position = ftell(fp);
if (fread(endof_central_dir, 1, 22, fp) != 22) {
fclose(fp);
PyErr_Format(ZipImportError, "can't read Zip file: "
@@ -689,7 +691,10 @@ read_directory(char *archive)
return NULL;
}
+ header_size = get_long((unsigned char *)endof_central_dir + 12);
header_offset = get_long((unsigned char *)endof_central_dir + 16);
+ arc_offset = header_position - header_offset - header_size;
+ header_offset += arc_offset;
files = PyDict_New();
if (files == NULL)
@@ -720,7 +725,7 @@ read_directory(char *archive)
PyMarshal_ReadShortFromFile(fp) +
PyMarshal_ReadShortFromFile(fp);
fseek(fp, header_offset + 42, 0);
- file_offset = PyMarshal_ReadLongFromFile(fp);
+ file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset;
if (name_size > MAXPATHLEN)
name_size = MAXPATHLEN;