https://github.com/python/cpython/commit/9172bc35c669b7706d7122d4f0a90f065700a474
commit: 9172bc35c669b7706d7122d4f0a90f065700a474
branch: 3.13
author: Miss Islington (bot) <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2024-06-17T22:30:26+05:30
summary:

[3.13] gh-115649: Copy the filename into main interpreter before intern in 
import.c (GH-120315) (#120652)

gh-115649: Copy the filename into main interpreter before intern in import.c 
(GH-120315)
(cherry picked from commit 28140d1f2da1766bfbb83f58779f15255c73c871)

Co-authored-by: AN Long <[email protected]>
Co-authored-by: Kumar Aditya <[email protected]>

files:
M Lib/test/test_import/__init__.py
M Python/import.c

diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
index b09065f812c0e4..f9e8558d1a71c8 100644
--- a/Lib/test/test_import/__init__.py
+++ b/Lib/test/test_import/__init__.py
@@ -2157,6 +2157,8 @@ def test_single_init_extension_compat(self):
             self.check_incompatible_here(module)
         with self.subTest(f'{module}: strict, fresh'):
             self.check_incompatible_fresh(module)
+        with self.subTest(f'{module}: isolated, fresh'):
+            self.check_incompatible_fresh(module, isolated=True)
 
     @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase 
module")
     def test_multi_init_extension_compat(self):
diff --git a/Python/import.c b/Python/import.c
index 10ac49fd95fc59..8cf97b51f65fec 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1969,7 +1969,17 @@ import_run_extension(PyThreadState *tstate, 
PyModInitFunction p0,
             if (info->filename != NULL) {
                 // XXX There's a refleak somewhere with the filename.
                 // Until we can track it down, we intern it.
-                PyObject *filename = Py_NewRef(info->filename);
+                PyObject *filename = NULL;
+                if (switched) {
+                    // The original filename may be allocated by 
subinterpreter's
+                    // obmalloc, so we create a copy here.
+                    filename = _PyUnicode_Copy(info->filename);
+                    if (filename == NULL) {
+                        return NULL;
+                    }
+                } else {
+                    filename = Py_NewRef(info->filename);
+                }
                 PyUnicode_InternInPlace(&filename);
                 if (PyModule_AddObjectRef(mod, "__file__", filename) < 0) {
                     PyErr_Clear(); /* Not important enough to report */

_______________________________________________
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