diff options
author | Eric Snow <ericsnowcurrently@gmail.com> | 2023-04-04 23:03:40 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-04 23:03:40 (GMT) |
commit | f513d5c80672c76acbdaf7d5b601f4bbe9fae56a (patch) | |
tree | 2e62703bea7ceb964c1de11eaa14a1383b23aed8 /Python/import.c | |
parent | bceb9e00ad2998e5193ad5b477e92a114dd31024 (diff) | |
download | cpython-f513d5c80672c76acbdaf7d5b601f4bbe9fae56a.zip cpython-f513d5c80672c76acbdaf7d5b601f4bbe9fae56a.tar.gz cpython-f513d5c80672c76acbdaf7d5b601f4bbe9fae56a.tar.bz2 |
gh-102660: Fix is_core_module() (gh-103257)
In gh-102744 we added is_core_module() (in Python/import.c), which relies on get_core_module_dict() (also added in that PR). The problem is that_PyImport_FixupBuiltin(), which ultimately calls is_core_module(), is called on the builtins module before interp->builtins_copyis set. Consequently, the builtins module isn't considered a "core" module while it is getting "fixed up" and its module def m_copy erroneously gets set. Under isolated interpreters this causes problems since sys and builtins are allowed even though they are still single-phase init modules. (This was discovered while working on gh-101660.)
The solution is to stop relying on get_core_module_dict() in is_core_module().
Diffstat (limited to 'Python/import.c')
-rw-r--r-- | Python/import.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/Python/import.c b/Python/import.c index 24249ae..1db5b93 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1110,7 +1110,17 @@ get_core_module_dict(PyInterpreterState *interp, static inline int is_core_module(PyInterpreterState *interp, PyObject *name, PyObject *filename) { - return get_core_module_dict(interp, name, filename) != NULL; + /* This might be called before the core dict copies are in place, + so we can't rely on get_core_module_dict() here. */ + if (filename == name) { + if (PyUnicode_CompareWithASCIIString(name, "sys") == 0) { + return 1; + } + if (PyUnicode_CompareWithASCIIString(name, "builtins") == 0) { + return 1; + } + } + return 0; } static int @@ -1136,6 +1146,8 @@ fix_up_extension(PyObject *mod, PyObject *name, PyObject *filename) // when the extension module doesn't support sub-interpreters. if (def->m_size == -1) { if (!is_core_module(tstate->interp, name, filename)) { + assert(PyUnicode_CompareWithASCIIString(name, "sys") != 0); + assert(PyUnicode_CompareWithASCIIString(name, "builtins") != 0); if (def->m_base.m_copy) { /* Somebody already imported the module, likely under a different name. |