mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Change the zipimport implementation to accept files containing
arbitrary bytes before the actual zip compatible archive. Zipfiles containing comments at the end of the file are still not supported. Add a testcase to test_zipimport, and update NEWS. This closes sf #775637 and sf #669036.
This commit is contained in:
parent
fac083d14a
commit
354e3d90d3
3 changed files with 31 additions and 3 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue