https://github.com/python/cpython/commit/dcbde6b7927179a1900d999bf3fcad03b6040ec1
commit: dcbde6b7927179a1900d999bf3fcad03b6040ec1
branch: 3.14
author: stratakis <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-12-20T12:49:23+05:30
summary:

[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)

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 0158709ad91947..23b4bf51912a06 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;
 }

_______________________________________________
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]

Reply via email to