Skip to content

Commit 8f8ad2c

Browse files
bpo-33451: Close pyc files before calling PyEval_EvalCode() (GH-7884)
Directly executed pyc files were being kept open longer than necessary. (cherry picked from commit ea73775) Co-authored-by: Zackery Spytz <[email protected]>
1 parent 7729d6d commit 8f8ad2c

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Close directly executed pyc files before calling ``PyEval_EvalCode()``.

Python/pythonrun.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,6 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
408408
goto done;
409409
}
410410
v = run_pyc_file(pyc_fp, filename, d, d, flags);
411-
fclose(pyc_fp);
412411
} else {
413412
/* When running from stdin, leave __main__.__loader__ alone */
414413
if (strcmp(filename, "<stdin>") != 0 &&
@@ -1041,27 +1040,31 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
10411040
if (!PyErr_Occurred())
10421041
PyErr_SetString(PyExc_RuntimeError,
10431042
"Bad magic number in .pyc file");
1044-
return NULL;
1043+
goto error;
10451044
}
10461045
/* Skip mtime and size */
10471046
(void) PyMarshal_ReadLongFromFile(fp);
10481047
(void) PyMarshal_ReadLongFromFile(fp);
1049-
if (PyErr_Occurred())
1050-
return NULL;
1051-
1048+
if (PyErr_Occurred()) {
1049+
goto error;
1050+
}
10521051
v = PyMarshal_ReadLastObjectFromFile(fp);
10531052
if (v == NULL || !PyCode_Check(v)) {
10541053
Py_XDECREF(v);
10551054
PyErr_SetString(PyExc_RuntimeError,
10561055
"Bad code object in .pyc file");
1057-
return NULL;
1056+
goto error;
10581057
}
1058+
fclose(fp);
10591059
co = (PyCodeObject *)v;
10601060
v = PyEval_EvalCode((PyObject*)co, globals, locals);
10611061
if (v && flags)
10621062
flags->cf_flags |= (co->co_flags & PyCF_MASK);
10631063
Py_DECREF(co);
10641064
return v;
1065+
error:
1066+
fclose(fp);
1067+
return NULL;
10651068
}
10661069

10671070
PyObject *

0 commit comments

Comments
 (0)