summaryrefslogtreecommitdiffstats
path: root/Python/import.c
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2023-04-04 23:03:40 (GMT)
committerGitHub <noreply@github.com>2023-04-04 23:03:40 (GMT)
commitf513d5c80672c76acbdaf7d5b601f4bbe9fae56a (patch)
tree2e62703bea7ceb964c1de11eaa14a1383b23aed8 /Python/import.c
parentbceb9e00ad2998e5193ad5b477e92a114dd31024 (diff)
downloadcpython-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.c14
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.