From 8eb18633b1788b0ce27ee0a5ffa011f8c0933107 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 24 Apr 2018 15:25:20 +0300 Subject: [PATCH 1/2] bpo-33330: Write exceptions occurred in PyImport_Cleanup() to stderr. They where silenced before. --- Objects/moduleobject.c | 10 ++++++---- Python/import.c | 38 +++++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 8fb368e41474a8..5fad4474be0f7c 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -603,8 +603,9 @@ _PyModule_ClearDict(PyObject *d) else PyErr_Clear(); } - if (PyDict_SetItem(d, key, Py_None) != 0) - PyErr_Clear(); + if (PyDict_SetItem(d, key, Py_None) != 0) { + PyErr_WriteUnraisable(NULL); + } } } } @@ -623,8 +624,9 @@ _PyModule_ClearDict(PyObject *d) else PyErr_Clear(); } - if (PyDict_SetItem(d, key, Py_None) != 0) - PyErr_Clear(); + if (PyDict_SetItem(d, key, Py_None) != 0) { + PyErr_WriteUnraisable(NULL); + } } } } diff --git a/Python/import.c b/Python/import.c index c29eb7b9415b17..5e44673bce51cc 100644 --- a/Python/import.c +++ b/Python/import.c @@ -417,14 +417,14 @@ PyImport_Cleanup(void) if (Py_VerboseFlag) PySys_WriteStderr("# clear builtins._\n"); if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) { - PyErr_Clear(); + PyErr_WriteUnraisable(NULL); } for (p = sys_deletes; *p != NULL; p++) { if (Py_VerboseFlag) PySys_WriteStderr("# clear sys.%s\n", *p); if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) { - PyErr_Clear(); + PyErr_WriteUnraisable(NULL); } } for (p = sys_files; *p != NULL; p+=2) { @@ -434,7 +434,7 @@ PyImport_Cleanup(void) if (value == NULL) value = Py_None; if (PyDict_SetItemString(interp->sysdict, *p, value) < 0) { - PyErr_Clear(); + PyErr_WriteUnraisable(NULL); } } @@ -443,8 +443,9 @@ PyImport_Cleanup(void) for diagnosis messages (in verbose mode), while the weakref helps detect those modules which have been held alive. */ weaklist = PyList_New(0); - if (weaklist == NULL) - PyErr_Clear(); + if (weaklist == NULL) { + PyErr_WriteUnraisable(NULL); + } #define STORE_MODULE_WEAKREF(name, mod) \ if (weaklist != NULL) { \ @@ -452,13 +453,13 @@ PyImport_Cleanup(void) if (wr) { \ PyObject *tup = PyTuple_Pack(2, name, wr); \ if (!tup || PyList_Append(weaklist, tup) < 0) { \ - PyErr_Clear(); \ + PyErr_WriteUnraisable(NULL); \ } \ Py_XDECREF(tup); \ Py_DECREF(wr); \ } \ else { \ - PyErr_Clear(); \ + PyErr_WriteUnraisable(NULL); \ } \ } #define CLEAR_MODULE(name, mod) \ @@ -467,7 +468,7 @@ PyImport_Cleanup(void) PySys_FormatStderr("# cleanup[2] removing %U\n", name); \ STORE_MODULE_WEAKREF(name, mod); \ if (PyObject_SetItem(modules, name, Py_None) < 0) { \ - PyErr_Clear(); \ + PyErr_WriteUnraisable(NULL); \ } \ } @@ -482,13 +483,13 @@ PyImport_Cleanup(void) else { PyObject *iterator = PyObject_GetIter(modules); if (iterator == NULL) { - PyErr_Clear(); + PyErr_WriteUnraisable(NULL); } else { while ((key = PyIter_Next(iterator))) { value = PyObject_GetItem(modules, key); if (value == NULL) { - PyErr_Clear(); + PyErr_WriteUnraisable(NULL); continue; } CLEAR_MODULE(key, value); @@ -496,7 +497,7 @@ PyImport_Cleanup(void) Py_DECREF(key); } if (PyErr_Occurred()) { - PyErr_Clear(); + PyErr_WriteUnraisable(NULL); } Py_DECREF(iterator); } @@ -508,17 +509,20 @@ PyImport_Cleanup(void) } else { _Py_IDENTIFIER(clear); - if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL) - PyErr_Clear(); + if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL) { + PyErr_WriteUnraisable(NULL); + } } /* Restore the original builtins dict, to ensure that any user data gets cleared. */ dict = PyDict_Copy(interp->builtins); - if (dict == NULL) - PyErr_Clear(); + if (dict == NULL) { + PyErr_WriteUnraisable(NULL); + } PyDict_Clear(interp->builtins); - if (PyDict_Update(interp->builtins, interp->builtins_copy)) - PyErr_Clear(); + if (PyDict_Update(interp->builtins, interp->builtins_copy)) { + PyErr_WriteUnraisable(NULL); + } Py_XDECREF(dict); /* Clear module dict copies stored in the interpreter state */ _PyState_ClearModules(); From 7a6dc6a3edae823ad0113b67ffaa9e7709f1c221 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 29 Apr 2018 19:58:44 +0300 Subject: [PATCH 2/2] Silence a bug exposed in test_embed. --- Python/import.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/import.c b/Python/import.c index 5e44673bce51cc..bb1d69e1689572 100644 --- a/Python/import.c +++ b/Python/import.c @@ -521,7 +521,7 @@ PyImport_Cleanup(void) } PyDict_Clear(interp->builtins); if (PyDict_Update(interp->builtins, interp->builtins_copy)) { - PyErr_WriteUnraisable(NULL); + PyErr_Clear(); } Py_XDECREF(dict); /* Clear module dict copies stored in the interpreter state */