Fix error paths and edge cases

This commit is contained in:
Pablo Galindo Salgado 2025-12-06 18:56:06 +00:00
parent 952ac2164d
commit 80133a59ff
2 changed files with 23 additions and 7 deletions

View file

@ -178,6 +178,7 @@ new_module_notrack(PyTypeObject *mt)
m->md_state = NULL; m->md_state = NULL;
m->md_weaklist = NULL; m->md_weaklist = NULL;
m->md_name = NULL; m->md_name = NULL;
m->m_dict_version = 0;
m->md_token_is_def = false; m->md_token_is_def = false;
#ifdef Py_GIL_DISABLED #ifdef Py_GIL_DISABLED
m->md_requires_gil = true; m->md_requires_gil = true;

View file

@ -3874,6 +3874,10 @@ _PyImport_LoadLazyImportTstate(PyThreadState *tstate, PyObject *lazy_import)
if (PyMapping_GetOptionalItem(lz->lz_builtins, &_Py_ID(__import__), &import_func) < 0) { if (PyMapping_GetOptionalItem(lz->lz_builtins, &_Py_ID(__import__), &import_func) < 0) {
goto error; goto error;
} }
if (import_func == NULL) {
PyErr_SetString(PyExc_ImportError, "__import__ not found");
goto error;
}
if (full) { if (full) {
obj = _PyEval_ImportNameWithImport(tstate, obj = _PyEval_ImportNameWithImport(tstate,
import_func, import_func,
@ -4305,7 +4309,12 @@ register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *builtin
if (parent_dict == NULL) { if (parent_dict == NULL) {
goto done; goto done;
} }
if (PyDict_CheckExact(parent_dict) && !PyDict_Contains(parent_dict, child)) { if (PyDict_CheckExact(parent_dict)) {
int contains = PyDict_Contains(parent_dict, child);
if (contains < 0) {
goto done;
}
if (!contains) {
PyObject *lazy_module_attr = _PyLazyImport_New(builtins, parent, child); PyObject *lazy_module_attr = _PyLazyImport_New(builtins, parent, child);
if (lazy_module_attr == NULL) { if (lazy_module_attr == NULL) {
goto done; goto done;
@ -4317,6 +4326,7 @@ register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *builtin
Py_DECREF(lazy_module_attr); Py_DECREF(lazy_module_attr);
} }
} }
}
Py_DECREF(name); Py_DECREF(name);
name = parent; name = parent;
@ -4344,7 +4354,8 @@ _PyImport_LazyImportModuleLevelObject(PyThreadState *tstate,
} }
PyInterpreterState *interp = tstate->interp; PyInterpreterState *interp = tstate->interp;
assert(_PyEval_GetFrame()->f_globals == _PyEval_GetFrame()->f_locals); // should only be called in global scope _PyInterpreterFrame *frame = _PyEval_GetFrame();
assert(frame != NULL && frame->f_globals == frame->f_locals); // should only be called in global scope
// Check if the filter disables the lazy import // Check if the filter disables the lazy import
PyObject *filter = FT_ATOMIC_LOAD_PTR_RELAXED(LAZY_IMPORTS_FILTER(interp)); PyObject *filter = FT_ATOMIC_LOAD_PTR_RELAXED(LAZY_IMPORTS_FILTER(interp));
@ -4374,6 +4385,10 @@ _PyImport_LazyImportModuleLevelObject(PyThreadState *tstate,
int is_true = PyObject_IsTrue(res); int is_true = PyObject_IsTrue(res);
Py_DECREF(res); Py_DECREF(res);
if (is_true < 0) {
Py_DECREF(abs_name);
return NULL;
}
if (!is_true) { if (!is_true) {
Py_DECREF(abs_name); Py_DECREF(abs_name);
return PyImport_ImportModuleLevelObject( return PyImport_ImportModuleLevelObject(