]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35993: Fix _PyInterpreterState_DeleteExceptMain() (GH-11852)
authorStéphane Wirtel <stephane@wirtel.be>
Wed, 20 Feb 2019 14:27:22 +0000 (15:27 +0100)
committerVictor Stinner <vstinner@redhat.com>
Wed, 20 Feb 2019 14:27:22 +0000 (15:27 +0100)
 Fix a crash on fork when using subinterpreters.

Misc/NEWS.d/next/Core and Builtins/2019-02-14-09-17-54.bpo-35993.Bvm3fP.rst [new file with mode: 0644]
Python/pystate.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-14-09-17-54.bpo-35993.Bvm3fP.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-14-09-17-54.bpo-35993.Bvm3fP.rst
new file mode 100644 (file)
index 0000000..3966f29
--- /dev/null
@@ -0,0 +1 @@
+Fix a crash on fork when using subinterpreters. Contributed by Stéphane Wirtel
index f0b2a6729f33306ae2277701fbf02c986babed56..acb672bdd9b8e01343acb90f333e3532ba53ecec 100644 (file)
@@ -281,10 +281,11 @@ _PyInterpreterState_DeleteExceptMain()
     HEAD_LOCK();
     PyInterpreterState *interp = _PyRuntime.interpreters.head;
     _PyRuntime.interpreters.head = NULL;
-    for (; interp != NULL; interp = interp->next) {
+    while (interp != NULL) {
         if (interp == _PyRuntime.interpreters.main) {
             _PyRuntime.interpreters.main->next = NULL;
             _PyRuntime.interpreters.head = interp;
+            interp = interp->next;
             continue;
         }
 
@@ -293,7 +294,9 @@ _PyInterpreterState_DeleteExceptMain()
         if (interp->id_mutex != NULL) {
             PyThread_free_lock(interp->id_mutex);
         }
-        PyMem_RawFree(interp);
+        PyInterpreterState *prev_interp = interp;
+        interp = interp->next;
+        PyMem_RawFree(prev_interp);
     }
     HEAD_UNLOCK();