https://github.com/python/cpython/commit/6a4f10325d58deb1906b39d68dc8e84f4c2bf5a4
commit: 6a4f10325d58deb1906b39d68dc8e84f4c2bf5a4
branch: main
author: stratakis <[email protected]>
committer: brettcannon <[email protected]>
date: 2025-12-19T10:14:52-08:00
summary:
gh-142776: Ensure fp file descriptor is closed on all code paths in import.c
(GH-142777)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst
M Python/import.c
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst
new file mode 100644
index 00000000000000..3039b04d89cb88
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-18-01-00-14.gh-issue-142776.ACaoeP.rst
@@ -0,0 +1 @@
+Fix a file descriptor leak in import.c
diff --git a/Python/import.c b/Python/import.c
index db433dbc971d76..466c5868ab7ee8 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -4762,6 +4762,7 @@ static PyObject *
_imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
/*[clinic end generated code: output=83249b827a4fde77 input=c31b954f4cf4e09d]*/
{
+ FILE *fp = NULL;
PyObject *mod = NULL;
PyThreadState *tstate = _PyThreadState_GET();
@@ -4804,16 +4805,12 @@ _imp_create_dynamic_impl(PyObject *module, PyObject
*spec, PyObject *file)
/* We would move this (and the fclose() below) into
* _PyImport_GetModuleExportHooks(), but it isn't clear if the intervening
* code relies on fp still being open. */
- FILE *fp;
if (file != NULL) {
fp = Py_fopen(info.filename, "r");
if (fp == NULL) {
goto finally;
}
}
- else {
- fp = NULL;
- }
PyModInitFunction p0 = NULL;
PyModExportFunction ex0 = NULL;
@@ -4822,7 +4819,7 @@ _imp_create_dynamic_impl(PyObject *module, PyObject
*spec, PyObject *file)
mod = import_run_modexport(tstate, ex0, &info, spec);
// Modules created from slots handle GIL enablement (Py_mod_gil slot)
// when they're created.
- goto cleanup;
+ goto finally;
}
if (p0 == NULL) {
goto finally;
@@ -4845,13 +4842,10 @@ _imp_create_dynamic_impl(PyObject *module, PyObject
*spec, PyObject *file)
}
#endif
-cleanup:
- // XXX Shouldn't this happen in the error cases too (i.e. in "finally")?
- if (fp) {
+finally:
+ if (fp != NULL) {
fclose(fp);
}
-
-finally:
_Py_ext_module_loader_info_clear(&info);
return mod;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]