summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2018-04-25 17:58:40 (GMT)
committerGitHub <noreply@github.com>2018-04-25 17:58:40 (GMT)
commite9d9494d6b2a5e0c2d48d22c7f0d5e95504b4f7e (patch)
tree32c2f4753e4fb7c0d05e6cac99024d170a820cdc
parent67a8f4fed3169e1b8c947c10f6e06863e399ae32 (diff)
downloadcpython-e9d9494d6b2a5e0c2d48d22c7f0d5e95504b4f7e.zip
cpython-e9d9494d6b2a5e0c2d48d22c7f0d5e95504b4f7e.tar.gz
cpython-e9d9494d6b2a5e0c2d48d22c7f0d5e95504b4f7e.tar.bz2
bpo-33330: Improve error handling in PyImport_Cleanup(). (GH-6564)
-rw-r--r--Python/import.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/Python/import.c b/Python/import.c
index 9f46da3..c29eb7b 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -364,7 +364,7 @@ PyImport_GetModule(PyObject *name)
}
else {
m = PyObject_GetItem(modules, name);
- if (PyErr_ExceptionMatches(PyExc_KeyError)) {
+ if (m == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
PyErr_Clear();
}
}
@@ -416,12 +416,16 @@ PyImport_Cleanup(void)
if (Py_VerboseFlag)
PySys_WriteStderr("# clear builtins._\n");
- PyDict_SetItemString(interp->builtins, "_", Py_None);
+ if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
+ PyErr_Clear();
+ }
for (p = sys_deletes; *p != NULL; p++) {
if (Py_VerboseFlag)
PySys_WriteStderr("# clear sys.%s\n", *p);
- PyDict_SetItemString(interp->sysdict, *p, Py_None);
+ if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
+ PyErr_Clear();
+ }
}
for (p = sys_files; *p != NULL; p+=2) {
if (Py_VerboseFlag)
@@ -429,7 +433,9 @@ PyImport_Cleanup(void)
value = PyDict_GetItemString(interp->sysdict, *(p+1));
if (value == NULL)
value = Py_None;
- PyDict_SetItemString(interp->sysdict, *p, value);
+ if (PyDict_SetItemString(interp->sysdict, *p, value) < 0) {
+ PyErr_Clear();
+ }
}
/* We prepare a list which will receive (name, weakref) tuples of
@@ -443,21 +449,26 @@ PyImport_Cleanup(void)
#define STORE_MODULE_WEAKREF(name, mod) \
if (weaklist != NULL) { \
PyObject *wr = PyWeakref_NewRef(mod, NULL); \
- if (name && wr) { \
+ if (wr) { \
PyObject *tup = PyTuple_Pack(2, name, wr); \
- PyList_Append(weaklist, tup); \
+ if (!tup || PyList_Append(weaklist, tup) < 0) { \
+ PyErr_Clear(); \
+ } \
Py_XDECREF(tup); \
+ Py_DECREF(wr); \
} \
- Py_XDECREF(wr); \
- if (PyErr_Occurred()) \
+ else { \
PyErr_Clear(); \
+ } \
}
#define CLEAR_MODULE(name, mod) \
if (PyModule_Check(mod)) { \
if (Py_VerboseFlag && PyUnicode_Check(name)) \
PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
STORE_MODULE_WEAKREF(name, mod); \
- PyObject_SetItem(modules, name, Py_None); \
+ if (PyObject_SetItem(modules, name, Py_None) < 0) { \
+ PyErr_Clear(); \
+ } \
}
/* Remove all modules from sys.modules, hoping that garbage collection
@@ -484,6 +495,9 @@ PyImport_Cleanup(void)
Py_DECREF(value);
Py_DECREF(key);
}
+ if (PyErr_Occurred()) {
+ PyErr_Clear();
+ }
Py_DECREF(iterator);
}
}
@@ -564,6 +578,7 @@ PyImport_Cleanup(void)
/* Once more */
_PyGC_CollectNoFail();
+#undef CLEAR_MODULE
#undef STORE_MODULE_WEAKREF
}