Skip to content

Commit 5200f55

Browse files
committed
Issue python#19428: Handle PyMarshal_Read*() errors in run_pyc_file()
Detect also earlier PyMarshal_Read*() errors in zipimport.
1 parent 50931f4 commit 5200f55

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

Modules/zipimport.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,9 @@ read_directory(PyObject *archive)
939939
header_size = name_size +
940940
PyMarshal_ReadShortFromFile(fp) +
941941
PyMarshal_ReadShortFromFile(fp);
942+
if (PyErr_Occurred())
943+
goto error;
944+
942945
if (fread(dummy, 1, 8, fp) != 8) /* Skip unused fields, avoid fseek */
943946
goto file_error;
944947
file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset;

Python/pythonrun.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -981,13 +981,17 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
981981

982982
magic = PyMarshal_ReadLongFromFile(fp);
983983
if (magic != PyImport_GetMagicNumber()) {
984-
PyErr_SetString(PyExc_RuntimeError,
985-
"Bad magic number in .pyc file");
984+
if (!PyErr_Occurred())
985+
PyErr_SetString(PyExc_RuntimeError,
986+
"Bad magic number in .pyc file");
986987
return NULL;
987988
}
988989
/* Skip mtime and size */
989990
(void) PyMarshal_ReadLongFromFile(fp);
990991
(void) PyMarshal_ReadLongFromFile(fp);
992+
if (PyErr_Occurred())
993+
return NULL;
994+
991995
v = PyMarshal_ReadLastObjectFromFile(fp);
992996
if (v == NULL || !PyCode_Check(v)) {
993997
Py_XDECREF(v);

0 commit comments

Comments
 (0)