bpo-36370: Check for PyErr_Occurred() after PyImport_GetModule() (GH-12504)

This commit is contained in:
Stefan Krah 2019-03-25 21:50:58 +01:00 committed by GitHub
parent d1e768a677
commit 027b09c5a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 11 deletions

View File

@ -4948,7 +4948,7 @@ import_from(PyObject *v, PyObject *name)
} }
x = PyImport_GetModule(fullmodname); x = PyImport_GetModule(fullmodname);
Py_DECREF(fullmodname); Py_DECREF(fullmodname);
if (x == NULL) { if (x == NULL && !PyErr_Occurred()) {
goto error; goto error;
} }
Py_DECREF(pkgname); Py_DECREF(pkgname);
@ -4971,7 +4971,7 @@ import_from(PyObject *v, PyObject *name)
"cannot import name %R from %R (unknown location)", "cannot import name %R from %R (unknown location)",
name, pkgname_or_unknown 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); PyErr_SetImportError(errmsg, pkgname, NULL);
} }
else { else {
@ -4979,7 +4979,7 @@ import_from(PyObject *v, PyObject *name)
"cannot import name %R from %R (%S)", "cannot import name %R from %R (%S)",
name, pkgname_or_unknown, pkgpath 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); PyErr_SetImportError(errmsg, pkgname, pkgpath);
} }

View File

@ -966,11 +966,10 @@ exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object
Py_DECREF(v); Py_DECREF(v);
m = PyImport_GetModule(name); m = PyImport_GetModule(name);
if (m == NULL) { if (m == NULL && !PyErr_Occurred()) {
PyErr_Format(PyExc_ImportError, PyErr_Format(PyExc_ImportError,
"Loaded module %R not found in sys.modules", "Loaded module %R not found in sys.modules",
name); name);
return NULL;
} }
return m; return m;
@ -1735,6 +1734,10 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
} }
mod = PyImport_GetModule(abs_name); mod = PyImport_GetModule(abs_name);
if (mod == NULL && PyErr_Occurred()) {
goto error;
}
if (mod != NULL && mod != Py_None) { if (mod != NULL && mod != Py_None) {
_Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(__spec__);
_Py_IDENTIFIER(_lock_unlock_module); _Py_IDENTIFIER(_lock_unlock_module);
@ -1810,9 +1813,11 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
final_mod = PyImport_GetModule(to_return); final_mod = PyImport_GetModule(to_return);
Py_DECREF(to_return); Py_DECREF(to_return);
if (final_mod == NULL) { if (final_mod == NULL) {
PyErr_Format(PyExc_KeyError, if (!PyErr_Occurred()) {
"%R not in sys.modules as expected", PyErr_Format(PyExc_KeyError,
to_return); "%R not in sys.modules as expected",
to_return);
}
goto error; goto error;
} }
} }
@ -1875,6 +1880,10 @@ PyImport_ReloadModule(PyObject *m)
PyObject *reloaded_module = NULL; PyObject *reloaded_module = NULL;
PyObject *imp = _PyImport_GetModuleId(&PyId_imp); PyObject *imp = _PyImport_GetModuleId(&PyId_imp);
if (imp == NULL) { if (imp == NULL) {
if (PyErr_Occurred()) {
return NULL;
}
imp = PyImport_ImportModule("imp"); imp = PyImport_ImportModule("imp");
if (imp == NULL) { if (imp == NULL) {
return NULL; return NULL;

View File

@ -2157,8 +2157,10 @@ wait_for_thread_shutdown(void)
PyObject *result; PyObject *result;
PyObject *threading = _PyImport_GetModuleId(&PyId_threading); PyObject *threading = _PyImport_GetModuleId(&PyId_threading);
if (threading == NULL) { if (threading == NULL) {
/* threading not imported */ if (PyErr_Occurred()) {
PyErr_Clear(); PyErr_WriteUnraisable(NULL);
}
/* else: threading not imported */
return; return;
} }
result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL); result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL);

View File

@ -283,7 +283,9 @@ sys_displayhook(PyObject *module, PyObject *o)
builtins = _PyImport_GetModuleId(&PyId_builtins); builtins = _PyImport_GetModuleId(&PyId_builtins);
if (builtins == NULL) { if (builtins == NULL) {
PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); if (!PyErr_Occurred()) {
PyErr_SetString(PyExc_RuntimeError, "lost builtins module");
}
return NULL; return NULL;
} }
Py_DECREF(builtins); Py_DECREF(builtins);