[Python-checkins] [3.12] gh-107471: Fix Refleaks in test_import (gh-107569) (#107571)

Yhg1s webhook-mailer at python.org
Wed Aug 2 17:23:19 EDT 2023


https://github.com/python/cpython/commit/12d1c494ae236e1a1ce8ae8084f8f9a6b6eb8295
commit: 12d1c494ae236e1a1ce8ae8084f8f9a6b6eb8295
branch: 3.12
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Yhg1s <thomas at python.org>
date: 2023-08-02T23:23:15+02:00
summary:

[3.12] gh-107471: Fix Refleaks in test_import (gh-107569) (#107571)

gh-107471: Fix Refleaks in test_import (gh-107569)

gh-107184 introduced a refleak in test_import.SubinterpImportTests (specifically test_singlephase_check_with_setting_and_override and test_single_init_extension_compat).  We fix it here by making sure _testsinglephase is removed from sys.modules whenever we clear the runtime's internal state for the module.

The underlying problem is strictly contained in the internal function _PyImport_ClearExtension() (AKA _testinternalcapi.clear_extension()), which is only used in tests.

(This also fixes an intermittent segfault introduced in the same place, in test_disallowed_reimport.)
(cherry picked from commit 017f047183fa33743f7e36c5c360f5c670032be3)

Co-authored-by: Eric Snow <ericsnowcurrently at gmail.com>

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 cc6e8d4e640cd..06adf01f18c0a 100644
--- a/Lib/test/test_import/__init__.py
+++ b/Lib/test/test_import/__init__.py
@@ -131,6 +131,7 @@ def _ready_to_import(name=None, source=""):
     def restore__testsinglephase(*, _orig=_testsinglephase):
         # We started with the module imported and want to restore
         # it to its nominal state.
+        sys.modules.pop('_testsinglephase', None)
         _orig._clear_globals()
         _testinternalcapi.clear_extension('_testsinglephase', _orig.__file__)
         import _testsinglephase
@@ -2110,7 +2111,7 @@ def clean_up():
             _interpreters.run_string(interpid, textwrap.dedent(f'''
                 name = {self.NAME!r}
                 if name in sys.modules:
-                    sys.modules[name]._clear_globals()
+                    sys.modules.pop(name)._clear_globals()
                 _testinternalcapi.clear_extension(name, {self.FILE!r})
                 '''))
             _interpreters.destroy(interpid)
diff --git a/Python/import.c b/Python/import.c
index f8f01f1bcd8c6..3f3f2a2b68135 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1080,6 +1080,7 @@ _extensions_cache_delete(PyObject *filename, PyObject *name)
        However, this decref would be problematic if the module def were
        dynamically allocated, it were the last ref, and this function
        were called with an interpreter other than the def's owner. */
+    assert(_Py_IsImmortal(entry->value));
     entry->value = NULL;
 
 finally:



More information about the Python-checkins mailing list