mirror of
https://github.com/python/cpython.git
synced 2025-09-02 06:57:58 +00:00
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:
parent
42bc60ead3
commit
82c83bd907
4 changed files with 70 additions and 46 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue