diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2018-04-25 17:58:40 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-25 17:58:40 (GMT) |
commit | e9d9494d6b2a5e0c2d48d22c7f0d5e95504b4f7e (patch) | |
tree | 32c2f4753e4fb7c0d05e6cac99024d170a820cdc | |
parent | 67a8f4fed3169e1b8c947c10f6e06863e399ae32 (diff) | |
download | cpython-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.c | 33 |
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 } |