[3.11] gh-109521: Fix obscure cases handling in PyImport_GetImporter() (GH-109522) (GH-109781)

PyImport_GetImporter() now sets RuntimeError if it fails to get sys.path_hooks
or sys.path_importer_cache or they are not list and dict correspondingly.

Previously it could return NULL without setting error in obscure cases,
crash or raise SystemError if these attributes have wrong type.
(cherry picked from commit 62c7015e89)
This commit is contained in:
Serhiy Storchaka 2023-10-07 16:05:13 +03:00 committed by GitHub
parent 3d5aa7ec61
commit 6a33529cf0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 3 deletions

View file

@ -951,11 +951,22 @@ PyImport_GetImporter(PyObject *path)
{
PyThreadState *tstate = _PyThreadState_GET();
PyObject *path_importer_cache = PySys_GetObject("path_importer_cache");
PyObject *path_hooks = PySys_GetObject("path_hooks");
if (path_importer_cache == NULL || path_hooks == NULL) {
if (path_importer_cache == NULL) {
PyErr_SetString(PyExc_RuntimeError, "lost sys.path_importer_cache");
return NULL;
}
return get_path_importer(tstate, path_importer_cache, path_hooks, path);
Py_INCREF(path_importer_cache);
PyObject *path_hooks = PySys_GetObject("path_hooks");
if (path_hooks == NULL) {
PyErr_SetString(PyExc_RuntimeError, "lost sys.path_hooks");
Py_DECREF(path_importer_cache);
return NULL;
}
Py_INCREF(path_hooks);
PyObject *importer = get_path_importer(tstate, path_importer_cache, path_hooks, path);
Py_DECREF(path_hooks);
Py_DECREF(path_importer_cache);
return importer;
}
#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE)