[Python-checkins] bpo-33330: Improve error handling in PyImport_Cleanup(). (GH-6564)

Miss Islington (bot) webhook-mailer at python.org
Wed Apr 25 14:32:55 EDT 2018


https://github.com/python/cpython/commit/291c9d4f74f3c7c57ae18e1aca617206795a090d
commit: 291c9d4f74f3c7c57ae18e1aca617206795a090d
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018-04-25T11:32:52-07:00
summary:

bpo-33330: Improve error handling in PyImport_Cleanup(). (GH-6564)

(cherry picked from commit e9d9494d6b2a5e0c2d48d22c7f0d5e95504b4f7e)

Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>

files:
M Python/import.c

diff --git a/Python/import.c b/Python/import.c
index eb5aeac55461..5d1794720cfc 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
 }
 



More information about the Python-checkins mailing list