From: stratakis Date: Sat, 20 Dec 2025 07:19:23 +0000 (+0100) Subject: [3.14] gh-142776: Ensure fp file descriptor is closed on all code paths in import... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dcbde6b7927179a1900d999bf3fcad03b6040ec1;p=thirdparty%2FPython%2Fcpython.git [3.14] gh-142776: Ensure fp file descriptor is closed on all code paths in import.c (GH-142777) (#142988) gh-142776: Ensure fp file descriptor is closed on all code paths in import.c (GH-142777) (cherry picked from commit 6a4f10325d58deb1906b39d68dc8e84f4c2bf5a4) --- 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 000000000000..3039b04d89cb --- /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 0158709ad919..23b4bf51912a 100644 --- a/Python/import.c +++ b/Python/import.c @@ -4687,6 +4687,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(); @@ -4729,16 +4730,12 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file) /* We would move this (and the fclose() below) into * _PyImport_GetModInitFunc(), 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 = _PyImport_GetModInitFunc(&info, fp); if (p0 == NULL) { @@ -4762,12 +4759,10 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file) } #endif - // 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; }