summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_import/__init__.py2
-rw-r--r--Python/import.c12
2 files changed, 13 insertions, 1 deletions
diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
index b09065f..f9e8558 100644
--- a/Lib/test/test_import/__init__.py
+++ b/Lib/test/test_import/__init__.py
@@ -2157,6 +2157,8 @@ class SubinterpImportTests(unittest.TestCase):
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 10ac49f..8cf97b5 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 */