]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[2.7] bpo-33330: Improve error handling in PyImport_Cleanup(). (GH-6564). (GH-6605)
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 26 Apr 2018 00:28:14 +0000 (03:28 +0300)
committerGitHub <noreply@github.com>
Thu, 26 Apr 2018 00:28:14 +0000 (03:28 +0300)
(cherry picked from commit e9d9494d6b2a5e0c2d48d22c7f0d5e95504b4f7e)

Python/import.c

index 1d74faf5f6df125c3db8d8e9d147db78c3b83a03..f43a47c1c4720142c74aa8ffe6641ae97642b17d 100644 (file)
@@ -447,7 +447,9 @@ PyImport_Cleanup(void)
         dict = PyModule_GetDict(value);
         if (Py_VerboseFlag)
             PySys_WriteStderr("# clear __builtin__._\n");
-        PyDict_SetItemString(dict, "_", Py_None);
+        if (PyDict_SetItemString(dict, "_", Py_None) < 0) {
+            PyErr_Clear();
+        }
     }
     value = PyDict_GetItemString(modules, "sys");
     if (value != NULL && PyModule_Check(value)) {
@@ -457,7 +459,9 @@ PyImport_Cleanup(void)
         for (p = sys_deletes; *p != NULL; p++) {
             if (Py_VerboseFlag)
                 PySys_WriteStderr("# clear sys.%s\n", *p);
-            PyDict_SetItemString(dict, *p, Py_None);
+            if (PyDict_SetItemString(dict, *p, Py_None) < 0) {
+                PyErr_Clear();
+            }
         }
         for (p = sys_files; *p != NULL; p+=2) {
             if (Py_VerboseFlag)
@@ -465,7 +469,9 @@ PyImport_Cleanup(void)
             v = PyDict_GetItemString(dict, *(p+1));
             if (v == NULL)
                 v = Py_None;
-            PyDict_SetItemString(dict, *p, v);
+            if (PyDict_SetItemString(dict, *p, v) < 0) {
+                PyErr_Clear();
+            }
         }
     }
 
@@ -475,7 +481,9 @@ PyImport_Cleanup(void)
         if (Py_VerboseFlag)
             PySys_WriteStderr("# cleanup __main__\n");
         _PyModule_Clear(value);
-        PyDict_SetItemString(modules, "__main__", Py_None);
+        if (PyDict_SetItemString(modules, "__main__", Py_None) < 0) {
+            PyErr_Clear();
+        }
     }
 
     /* The special treatment of __builtin__ here is because even
@@ -510,10 +518,15 @@ PyImport_Cleanup(void)
                     PySys_WriteStderr(
                         "# cleanup[1] %s\n", name);
                 _PyModule_Clear(value);
-                PyDict_SetItem(modules, key, Py_None);
+                if (PyDict_SetItem(modules, key, Py_None) < 0) {
+                    PyErr_Clear();
+                }
                 ndone++;
             }
         }
+        if (PyErr_Occurred()) {
+            PyErr_Clear();
+        }
     } while (ndone > 0);
 
     /* Next, delete all modules (still skipping __builtin__ and sys) */
@@ -528,7 +541,12 @@ PyImport_Cleanup(void)
             if (Py_VerboseFlag)
                 PySys_WriteStderr("# cleanup[2] %s\n", name);
             _PyModule_Clear(value);
-            PyDict_SetItem(modules, key, Py_None);
+            if (PyDict_SetItem(modules, key, Py_None) < 0) {
+                PyErr_Clear();
+            }
+        }
+        if (PyErr_Occurred()) {
+            PyErr_Clear();
         }
     }
 
@@ -538,14 +556,18 @@ PyImport_Cleanup(void)
         if (Py_VerboseFlag)
             PySys_WriteStderr("# cleanup sys\n");
         _PyModule_Clear(value);
-        PyDict_SetItemString(modules, "sys", Py_None);
+        if (PyDict_SetItemString(modules, "sys", Py_None) < 0) {
+            PyErr_Clear();
+        }
     }
     value = PyDict_GetItemString(modules, "__builtin__");
     if (value != NULL && PyModule_Check(value)) {
         if (Py_VerboseFlag)
             PySys_WriteStderr("# cleanup __builtin__\n");
         _PyModule_Clear(value);
-        PyDict_SetItemString(modules, "__builtin__", Py_None);
+        if (PyDict_SetItemString(modules, "__builtin__", Py_None) < 0) {
+            PyErr_Clear();
+        }
     }
 
     /* Finally, clear and delete the modules directory */