[Python-checkins] bpo-1635741: Clean sysdict and builtins of interpreter at exit (GH-21605)

Hai Shi webhook-mailer at python.org
Wed Aug 12 17:23:38 EDT 2020


https://github.com/python/cpython/commit/8ecc0c4d390d03de5cd2344aa44b69ed02ffe470
commit: 8ecc0c4d390d03de5cd2344aa44b69ed02ffe470
branch: master
author: Hai Shi <shihai1992 at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-08-12T23:23:30+02:00
summary:

bpo-1635741: Clean sysdict and builtins of interpreter at exit (GH-21605)

files:
M Python/pystate.c

diff --git a/Python/pystate.c b/Python/pystate.c
index d0cbf5cb8364b..f6d1956e9dce9 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -294,8 +294,6 @@ PyInterpreterState_Clear(PyInterpreterState *interp)
     Py_CLEAR(interp->codec_error_registry);
     Py_CLEAR(interp->modules);
     Py_CLEAR(interp->modules_by_index);
-    Py_CLEAR(interp->sysdict);
-    Py_CLEAR(interp->builtins);
     Py_CLEAR(interp->builtins_copy);
     Py_CLEAR(interp->importlib);
     Py_CLEAR(interp->import_func);
@@ -308,6 +306,14 @@ PyInterpreterState_Clear(PyInterpreterState *interp)
     if (_PyRuntimeState_GetFinalizing(runtime) == NULL) {
         _PyWarnings_Fini(interp);
     }
+    /* We don't clear sysdict and builtins until the end of this function.
+       Because clearing other attributes can execute arbitrary Python code
+       which requires sysdict and builtins. */
+    PyDict_Clear(interp->sysdict);
+    PyDict_Clear(interp->builtins);
+    Py_CLEAR(interp->sysdict);
+    Py_CLEAR(interp->builtins);
+
     // XXX Once we have one allocator per interpreter (i.e.
     // per-interpreter GC) we must ensure that all of the interpreter's
     // objects have been cleaned up at the point.



More information about the Python-checkins mailing list