diff options
author | Stefan Krah <skrah@bytereef.org> | 2019-03-25 20:50:58 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-25 20:50:58 (GMT) |
commit | 027b09c5a13aac9e14a3b43bb385298d549c3833 (patch) | |
tree | 44c35e9ec4e1ae42dde580a0ea369e5a1c32de1a | |
parent | d1e768a67707bf7bb426c1537e1a764e89eaff78 (diff) | |
download | cpython-027b09c5a13aac9e14a3b43bb385298d549c3833.zip cpython-027b09c5a13aac9e14a3b43bb385298d549c3833.tar.gz cpython-027b09c5a13aac9e14a3b43bb385298d549c3833.tar.bz2 |
bpo-36370: Check for PyErr_Occurred() after PyImport_GetModule() (GH-12504)
-rw-r--r-- | Python/ceval.c | 6 | ||||
-rw-r--r-- | Python/import.c | 19 | ||||
-rw-r--r-- | Python/pylifecycle.c | 6 | ||||
-rw-r--r-- | Python/sysmodule.c | 4 |
4 files changed, 24 insertions, 11 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 40320bf..28e9232 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4948,7 +4948,7 @@ import_from(PyObject *v, PyObject *name) } x = PyImport_GetModule(fullmodname); Py_DECREF(fullmodname); - if (x == NULL) { + if (x == NULL && !PyErr_Occurred()) { goto error; } Py_DECREF(pkgname); @@ -4971,7 +4971,7 @@ import_from(PyObject *v, PyObject *name) "cannot import name %R from %R (unknown location)", name, pkgname_or_unknown ); - /* NULL check for errmsg done by PyErr_SetImportError. */ + /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */ PyErr_SetImportError(errmsg, pkgname, NULL); } else { @@ -4979,7 +4979,7 @@ import_from(PyObject *v, PyObject *name) "cannot import name %R from %R (%S)", name, pkgname_or_unknown, pkgpath ); - /* NULL check for errmsg done by PyErr_SetImportError. */ + /* NULL checks for errmsg and pkgname done by PyErr_SetImportError. */ PyErr_SetImportError(errmsg, pkgname, pkgpath); } diff --git a/Python/import.c b/Python/import.c index bf3a994..c00c3aa 100644 --- a/Python/import.c +++ b/Python/import.c @@ -966,11 +966,10 @@ exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object Py_DECREF(v); m = PyImport_GetModule(name); - if (m == NULL) { + if (m == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_ImportError, "Loaded module %R not found in sys.modules", name); - return NULL; } return m; @@ -1735,6 +1734,10 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } mod = PyImport_GetModule(abs_name); + if (mod == NULL && PyErr_Occurred()) { + goto error; + } + if (mod != NULL && mod != Py_None) { _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(_lock_unlock_module); @@ -1810,9 +1813,11 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, final_mod = PyImport_GetModule(to_return); Py_DECREF(to_return); if (final_mod == NULL) { - PyErr_Format(PyExc_KeyError, - "%R not in sys.modules as expected", - to_return); + if (!PyErr_Occurred()) { + PyErr_Format(PyExc_KeyError, + "%R not in sys.modules as expected", + to_return); + } goto error; } } @@ -1875,6 +1880,10 @@ PyImport_ReloadModule(PyObject *m) PyObject *reloaded_module = NULL; PyObject *imp = _PyImport_GetModuleId(&PyId_imp); if (imp == NULL) { + if (PyErr_Occurred()) { + return NULL; + } + imp = PyImport_ImportModule("imp"); if (imp == NULL) { return NULL; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 66cadc9..e08f290 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -2157,8 +2157,10 @@ wait_for_thread_shutdown(void) PyObject *result; PyObject *threading = _PyImport_GetModuleId(&PyId_threading); if (threading == NULL) { - /* threading not imported */ - PyErr_Clear(); + if (PyErr_Occurred()) { + PyErr_WriteUnraisable(NULL); + } + /* else: threading not imported */ return; } result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 4351a7f..3df4d44 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -283,7 +283,9 @@ sys_displayhook(PyObject *module, PyObject *o) builtins = _PyImport_GetModuleId(&PyId_builtins); if (builtins == NULL) { - PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + } return NULL; } Py_DECREF(builtins); |