summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-10-02 15:22:40 (GMT)
committerGitHub <noreply@github.com>2023-10-02 15:22:40 (GMT)
commit5e6e99646e46d485e018429f6000661609e4f1b5 (patch)
treedb68548fffc53b7c3fe4440e723560912238a5af /Python
parent6a6bea3ee8bbe52e4307c4da1ed4a7b9c78cbe45 (diff)
downloadcpython-5e6e99646e46d485e018429f6000661609e4f1b5.zip
cpython-5e6e99646e46d485e018429f6000661609e4f1b5.tar.gz
cpython-5e6e99646e46d485e018429f6000661609e4f1b5.tar.bz2
[3.12] gh-109521: Fix obscure cases handling in PyImport_GetImporter() (GH-109522) (#109777)
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. (cherry picked from commit 62c7015e89cbdedb5218d4fedd45f971885f67a8) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
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 3f3f2a2..54232a1 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2380,9 +2380,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)
@@ -2425,11 +2430,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;
}