mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #19428: zipimport now handles errors when reading truncated or invalid
ZIP archive.
This commit is contained in:
parent
a5afb58986
commit
73660af6af
2 changed files with 16 additions and 3 deletions
|
@ -10,6 +10,9 @@ Projected release date: 2013-11-24
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #19428: zipimport now handles errors when reading truncated or invalid
|
||||
ZIP archive.
|
||||
|
||||
- Issue #18408: Add a new PyFrame_FastToLocalsWithError() function to handle
|
||||
exceptions when merging fast locals into f_locals of a frame.
|
||||
PyEval_GetLocals() now raises an exception and return NULL on failure.
|
||||
|
|
|
@ -914,6 +914,8 @@ read_directory(PyObject *archive)
|
|||
|
||||
/* Start of file header */
|
||||
l = PyMarshal_ReadLongFromFile(fp);
|
||||
if (l == -1 && PyErr_Occurred())
|
||||
goto error;
|
||||
if (l != 0x02014B50)
|
||||
break; /* Bad: Central Dir File Header */
|
||||
|
||||
|
@ -937,6 +939,9 @@ read_directory(PyObject *archive)
|
|||
if (fread(dummy, 1, 8, fp) != 8) /* Skip unused fields, avoid fseek */
|
||||
goto file_error;
|
||||
file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset;
|
||||
if (PyErr_Occurred())
|
||||
goto error;
|
||||
|
||||
if (name_size > MAXPATHLEN)
|
||||
name_size = MAXPATHLEN;
|
||||
|
||||
|
@ -1082,9 +1087,10 @@ get_data(PyObject *archive, PyObject *toc_entry)
|
|||
l = PyMarshal_ReadLongFromFile(fp);
|
||||
if (l != 0x04034B50) {
|
||||
/* Bad: Local File Header */
|
||||
PyErr_Format(ZipImportError,
|
||||
"bad local file header in %U",
|
||||
archive);
|
||||
if (!PyErr_Occurred())
|
||||
PyErr_Format(ZipImportError,
|
||||
"bad local file header in %U",
|
||||
archive);
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1096,6 +1102,10 @@ get_data(PyObject *archive, PyObject *toc_entry)
|
|||
|
||||
l = 30 + PyMarshal_ReadShortFromFile(fp) +
|
||||
PyMarshal_ReadShortFromFile(fp); /* local header size */
|
||||
if (PyErr_Occurred()) {
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
file_offset += l; /* Start of file data */
|
||||
|
||||
bytes_size = compress == 0 ? data_size : data_size + 1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue