|
|
|
@ -875,7 +875,12 @@ read_directory(PyObject *archive) |
|
|
|
PyErr_Format(ZipImportError, "can't open Zip file: %R", archive); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
fseek(fp, -22, SEEK_END); |
|
|
|
|
|
|
|
if (fseek(fp, -22, SEEK_END) == -1) { |
|
|
|
fclose(fp); |
|
|
|
PyErr_Format(ZipImportError, "can't read Zip file: %R", archive); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
header_position = ftell(fp); |
|
|
|
if (fread(endof_central_dir, 1, 22, fp) != 22) { |
|
|
|
fclose(fp); |
|
|
|
@ -904,11 +909,13 @@ read_directory(PyObject *archive) |
|
|
|
PyObject *t; |
|
|
|
int err; |
|
|
|
|
|
|
|
fseek(fp, header_offset, 0); /* Start of file header */ |
|
|
|
if (fseek(fp, header_offset, 0) == -1) /* Start of file header */ |
|
|
|
goto fseek_error; |
|
|
|
l = PyMarshal_ReadLongFromFile(fp); |
|
|
|
if (l != 0x02014B50) |
|
|
|
break; /* Bad: Central Dir File Header */ |
|
|
|
fseek(fp, header_offset + 8, 0); |
|
|
|
if (fseek(fp, header_offset + 8, 0) == -1) |
|
|
|
goto fseek_error; |
|
|
|
flags = (unsigned short)PyMarshal_ReadShortFromFile(fp); |
|
|
|
compress = PyMarshal_ReadShortFromFile(fp); |
|
|
|
time = PyMarshal_ReadShortFromFile(fp); |
|
|
|
@ -920,7 +927,8 @@ read_directory(PyObject *archive) |
|
|
|
header_size = 46 + name_size + |
|
|
|
PyMarshal_ReadShortFromFile(fp) + |
|
|
|
PyMarshal_ReadShortFromFile(fp); |
|
|
|
fseek(fp, header_offset + 42, 0); |
|
|
|
if (fseek(fp, header_offset + 42, 0) == -1) |
|
|
|
goto fseek_error; |
|
|
|
file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset; |
|
|
|
if (name_size > MAXPATHLEN) |
|
|
|
name_size = MAXPATHLEN; |
|
|
|
@ -980,6 +988,12 @@ read_directory(PyObject *archive) |
|
|
|
PySys_FormatStderr("# zipimport: found %ld names in %R\n", |
|
|
|
count, archive); |
|
|
|
return files; |
|
|
|
fseek_error: |
|
|
|
fclose(fp); |
|
|
|
Py_XDECREF(files); |
|
|
|
Py_XDECREF(nameobj); |
|
|
|
PyErr_Format(ZipImportError, "can't read Zip file: %R", archive); |
|
|
|
return NULL; |
|
|
|
error: |
|
|
|
fclose(fp); |
|
|
|
Py_XDECREF(files); |
|
|
|
@ -1050,7 +1064,12 @@ get_data(PyObject *archive, PyObject *toc_entry) |
|
|
|
} |
|
|
|
|
|
|
|
/* Check to make sure the local file header is correct */ |
|
|
|
fseek(fp, file_offset, 0); |
|
|
|
if (fseek(fp, file_offset, 0) == -1) { |
|
|
|
fclose(fp); |
|
|
|
PyErr_Format(ZipImportError, "can't read Zip file: %R", archive); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
l = PyMarshal_ReadLongFromFile(fp); |
|
|
|
if (l != 0x04034B50) { |
|
|
|
/* Bad: Local File Header */ |
|
|
|
@ -1060,7 +1079,12 @@ get_data(PyObject *archive, PyObject *toc_entry) |
|
|
|
fclose(fp); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
fseek(fp, file_offset + 26, 0); |
|
|
|
if (fseek(fp, file_offset + 26, 0) == -1) { |
|
|
|
fclose(fp); |
|
|
|
PyErr_Format(ZipImportError, "can't read Zip file: %R", archive); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
l = 30 + PyMarshal_ReadShortFromFile(fp) + |
|
|
|
PyMarshal_ReadShortFromFile(fp); /* local header size */ |
|
|
|
file_offset += l; /* Start of file data */ |
|
|
|
@ -1077,8 +1101,13 @@ get_data(PyObject *archive, PyObject *toc_entry) |
|
|
|
buf = PyBytes_AsString(raw_data); |
|
|
|
|
|
|
|
err = fseek(fp, file_offset, 0); |
|
|
|
if (err == 0) |
|
|
|
if (err == 0) { |
|
|
|
bytes_read = fread(buf, 1, data_size, fp); |
|
|
|
} else { |
|
|
|
fclose(fp); |
|
|
|
PyErr_Format(ZipImportError, "can't read Zip file: %R", archive); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
fclose(fp); |
|
|
|
if (err || bytes_read != data_size) { |
|
|
|
PyErr_SetString(PyExc_IOError, |
|
|
|
|