bpo-38858: _PyImport_FixupExtensionObject() handles subinterpreters (GH-17350)

If _PyImport_FixupExtensionObject() is called from a subinterpreter,
leave extensions unchanged and don't copy the module dictionary
into def->m_base.m_copy.
This commit is contained in:
Victor Stinner 2019-11-22 18:52:27 +01:00 committed by GitHub
parent 42bc60ead3
commit 82c83bd907
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 70 additions and 46 deletions

View file

@ -695,50 +695,62 @@ int
_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
PyObject *filename, PyObject *modules)
{
PyObject *dict, *key;
struct PyModuleDef *def;
int res;
if (extensions == NULL) {
extensions = PyDict_New();
if (extensions == NULL)
return -1;
}
if (mod == NULL || !PyModule_Check(mod)) {
PyErr_BadInternalCall();
return -1;
}
def = PyModule_GetDef(mod);
struct PyModuleDef *def = PyModule_GetDef(mod);
if (!def) {
PyErr_BadInternalCall();
return -1;
}
if (PyObject_SetItem(modules, name, mod) < 0)
PyThreadState *tstate = _PyThreadState_GET();
if (PyObject_SetItem(modules, name, mod) < 0) {
return -1;
if (_PyState_AddModule(mod, def) < 0) {
}
if (_PyState_AddModule(tstate, mod, def) < 0) {
PyMapping_DelItem(modules, name);
return -1;
}
if (def->m_size == -1) {
if (def->m_base.m_copy) {
/* Somebody already imported the module,
likely under a different name.
XXX this should really not happen. */
Py_CLEAR(def->m_base.m_copy);
if (_Py_IsMainInterpreter(tstate)) {
if (def->m_size == -1) {
if (def->m_base.m_copy) {
/* Somebody already imported the module,
likely under a different name.
XXX this should really not happen. */
Py_CLEAR(def->m_base.m_copy);
}
PyObject *dict = PyModule_GetDict(mod);
if (dict == NULL) {
return -1;
}
def->m_base.m_copy = PyDict_Copy(dict);
if (def->m_base.m_copy == NULL) {
return -1;
}
}
dict = PyModule_GetDict(mod);
if (dict == NULL)
if (extensions == NULL) {
extensions = PyDict_New();
if (extensions == NULL) {
return -1;
}
}
PyObject *key = PyTuple_Pack(2, filename, name);
if (key == NULL) {
return -1;
def->m_base.m_copy = PyDict_Copy(dict);
if (def->m_base.m_copy == NULL)
}
int res = PyDict_SetItem(extensions, key, (PyObject *)def);
Py_DECREF(key);
if (res < 0) {
return -1;
}
}
key = PyTuple_Pack(2, filename, name);
if (key == NULL)
return -1;
res = PyDict_SetItem(extensions, key, (PyObject *)def);
Py_DECREF(key);
if (res < 0)
return -1;
return 0;
}
@ -801,7 +813,7 @@ import_find_extension(PyThreadState *tstate, PyObject *name,
}
Py_DECREF(mod);
}
if (_PyState_AddModule(mod, def) < 0) {
if (_PyState_AddModule(tstate, mod, def) < 0) {
PyMapping_DelItem(modules, name);
return NULL;
}