summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-09-23 06:39:24 (GMT)
committerGitHub <noreply@github.com>2023-09-23 06:39:24 (GMT)
commit62c7015e89cbdedb5218d4fedd45f971885f67a8 (patch)
treea6c8a17353fbaf884de9d370f176f8f087bab26f /Python
parentb8d1744e7ba87a4057350fdfd788b5621095fc59 (diff)
downloadcpython-62c7015e89cbdedb5218d4fedd45f971885f67a8.zip
cpython-62c7015e89cbdedb5218d4fedd45f971885f67a8.tar.gz
cpython-62c7015e89cbdedb5218d4fedd45f971885f67a8.tar.bz2
gh-109521: Fix obscure cases handling in PyImport_GetImporter() (GH-109522)
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.
Diffstat (limited to 'Python')
-rw-r--r--Python/import.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/Python/import.c b/Python/import.c
index 9b0be02..5a06cb3 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2363,9 +2363,14 @@ get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache,
PyObject *importer;
Py_ssize_t j, nhooks;
- /* These conditions are the caller's responsibility: */
- assert(PyList_Check(path_hooks));
- assert(PyDict_Check(path_importer_cache));
+ if (!PyList_Check(path_hooks)) {
+ PyErr_SetString(PyExc_RuntimeError, "sys.path_hooks is not a list");
+ return NULL;
+ }
+ if (!PyDict_Check(path_importer_cache)) {
+ PyErr_SetString(PyExc_RuntimeError, "sys.path_importer_cache is not a dict");
+ return NULL;
+ }
nhooks = PyList_Size(path_hooks);
if (nhooks < 0)
@@ -2408,11 +2413,22 @@ PyImport_GetImporter(PyObject *path)
{
PyThreadState *tstate = _PyThreadState_GET();
PyObject *path_importer_cache = PySys_GetObject("path_importer_cache");
+ if (path_importer_cache == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "lost sys.path_importer_cache");
+ return NULL;
+ }
+ Py_INCREF(path_importer_cache);
PyObject *path_hooks = PySys_GetObject("path_hooks");
- if (path_importer_cache == NULL || path_hooks == NULL) {
+ if (path_hooks == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "lost sys.path_hooks");
+ Py_DECREF(path_importer_cache);
return NULL;
}
- return get_path_importer(tstate, path_importer_cache, path_hooks, path);
+ 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;
}