bpo-33451: Close pyc files before calling PyEval_EvalCode() (GH-7884)

Directly executed pyc files were being kept open longer than necessary.
This commit is contained in:
Zackery Spytz 2018-06-23 21:15:24 -06:00 committed by Nick Coghlan
parent 0ba9a0b7d1
commit ea737751b1
2 changed files with 10 additions and 6 deletions

View File

@ -0,0 +1 @@
Close directly executed pyc files before calling ``PyEval_EvalCode()``.

View File

@ -418,7 +418,6 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
goto done;
}
v = run_pyc_file(pyc_fp, filename, d, d, flags);
fclose(pyc_fp);
} else {
/* When running from stdin, leave __main__.__loader__ alone */
if (strcmp(filename, "<stdin>") != 0 &&
@ -1051,28 +1050,32 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
if (!PyErr_Occurred())
PyErr_SetString(PyExc_RuntimeError,
"Bad magic number in .pyc file");
return NULL;
goto error;
}
/* Skip the rest of the header. */
(void) PyMarshal_ReadLongFromFile(fp);
(void) PyMarshal_ReadLongFromFile(fp);
(void) PyMarshal_ReadLongFromFile(fp);
if (PyErr_Occurred())
return NULL;
if (PyErr_Occurred()) {
goto error;
}
v = PyMarshal_ReadLastObjectFromFile(fp);
if (v == NULL || !PyCode_Check(v)) {
Py_XDECREF(v);
PyErr_SetString(PyExc_RuntimeError,
"Bad code object in .pyc file");
return NULL;
goto error;
}
fclose(fp);
co = (PyCodeObject *)v;
v = PyEval_EvalCode((PyObject*)co, globals, locals);
if (v && flags)
flags->cf_flags |= (co->co_flags & PyCF_MASK);
Py_DECREF(co);
return v;
error:
fclose(fp);
return NULL;
}
PyObject *