Skip to content

Commit 94f84b6

Browse files
[2.7] bpo-33330: Improve error handling in PyImport_Cleanup(). (pythonGH-6564).
(cherry picked from commit e9d9494) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 730fb07 commit 94f84b6

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

Python/import.c

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,9 @@ PyImport_Cleanup(void)
447447
dict = PyModule_GetDict(value);
448448
if (Py_VerboseFlag)
449449
PySys_WriteStderr("# clear __builtin__._\n");
450-
PyDict_SetItemString(dict, "_", Py_None);
450+
if (PyDict_SetItemString(dict, "_", Py_None) < 0) {
451+
PyErr_Clear();
452+
}
451453
}
452454
value = PyDict_GetItemString(modules, "sys");
453455
if (value != NULL && PyModule_Check(value)) {
@@ -457,15 +459,19 @@ PyImport_Cleanup(void)
457459
for (p = sys_deletes; *p != NULL; p++) {
458460
if (Py_VerboseFlag)
459461
PySys_WriteStderr("# clear sys.%s\n", *p);
460-
PyDict_SetItemString(dict, *p, Py_None);
462+
if (PyDict_SetItemString(dict, *p, Py_None) < 0) {
463+
PyErr_Clear();
464+
}
461465
}
462466
for (p = sys_files; *p != NULL; p+=2) {
463467
if (Py_VerboseFlag)
464468
PySys_WriteStderr("# restore sys.%s\n", *p);
465469
v = PyDict_GetItemString(dict, *(p+1));
466470
if (v == NULL)
467471
v = Py_None;
468-
PyDict_SetItemString(dict, *p, v);
472+
if (PyDict_SetItemString(dict, *p, v) < 0) {
473+
PyErr_Clear();
474+
}
469475
}
470476
}
471477

@@ -475,7 +481,9 @@ PyImport_Cleanup(void)
475481
if (Py_VerboseFlag)
476482
PySys_WriteStderr("# cleanup __main__\n");
477483
_PyModule_Clear(value);
478-
PyDict_SetItemString(modules, "__main__", Py_None);
484+
if (PyDict_SetItemString(modules, "__main__", Py_None) < 0) {
485+
PyErr_Clear();
486+
}
479487
}
480488

481489
/* The special treatment of __builtin__ here is because even
@@ -510,10 +518,15 @@ PyImport_Cleanup(void)
510518
PySys_WriteStderr(
511519
"# cleanup[1] %s\n", name);
512520
_PyModule_Clear(value);
513-
PyDict_SetItem(modules, key, Py_None);
521+
if (PyDict_SetItem(modules, key, Py_None) < 0) {
522+
PyErr_Clear();
523+
}
514524
ndone++;
515525
}
516526
}
527+
if (PyErr_Occurred()) {
528+
PyErr_Clear();
529+
}
517530
} while (ndone > 0);
518531

519532
/* Next, delete all modules (still skipping __builtin__ and sys) */
@@ -528,7 +541,12 @@ PyImport_Cleanup(void)
528541
if (Py_VerboseFlag)
529542
PySys_WriteStderr("# cleanup[2] %s\n", name);
530543
_PyModule_Clear(value);
531-
PyDict_SetItem(modules, key, Py_None);
544+
if (PyDict_SetItem(modules, key, Py_None) < 0) {
545+
PyErr_Clear();
546+
}
547+
}
548+
if (PyErr_Occurred()) {
549+
PyErr_Clear();
532550
}
533551
}
534552

@@ -538,14 +556,18 @@ PyImport_Cleanup(void)
538556
if (Py_VerboseFlag)
539557
PySys_WriteStderr("# cleanup sys\n");
540558
_PyModule_Clear(value);
541-
PyDict_SetItemString(modules, "sys", Py_None);
559+
if (PyDict_SetItemString(modules, "sys", Py_None) < 0) {
560+
PyErr_Clear();
561+
}
542562
}
543563
value = PyDict_GetItemString(modules, "__builtin__");
544564
if (value != NULL && PyModule_Check(value)) {
545565
if (Py_VerboseFlag)
546566
PySys_WriteStderr("# cleanup __builtin__\n");
547567
_PyModule_Clear(value);
548-
PyDict_SetItemString(modules, "__builtin__", Py_None);
568+
if (PyDict_SetItemString(modules, "__builtin__", Py_None) < 0) {
569+
PyErr_Clear();
570+
}
549571
}
550572

551573
/* Finally, clear and delete the modules directory */

0 commit comments

Comments
 (0)