From 291c9d4f74f3c7c57ae18e1aca617206795a090d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 25 Apr 2018 11:32:52 -0700 Subject: [PATCH] bpo-33330: Improve error handling in PyImport_Cleanup(). (GH-6564) (cherry picked from commit e9d9494d6b2a5e0c2d48d22c7f0d5e95504b4f7e) Co-authored-by: Serhiy Storchaka --- Python/import.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/Python/import.c b/Python/import.c index eb5aeac5546..5d1794720cf 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 }