bpo-35993: Fix _PyInterpreterState_DeleteExceptMain() (GH-11852) · python/cpython@b5409da (original) (raw)
File tree
2 files changed
lines changed
- Misc/NEWS.d/next/Core and Builtins
2 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
1 | +Fix a crash on fork when using subinterpreters. Contributed by Stéphane Wirtel |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -281,10 +281,11 @@ _PyInterpreterState_DeleteExceptMain() | ||
281 | 281 | HEAD_LOCK(); |
282 | 282 | PyInterpreterState *interp = _PyRuntime.interpreters.head; |
283 | 283 | _PyRuntime.interpreters.head = NULL; |
284 | -for (; interp != NULL; interp = interp->next) { | |
284 | +while (interp != NULL) { | |
285 | 285 | if (interp == _PyRuntime.interpreters.main) { |
286 | 286 | _PyRuntime.interpreters.main->next = NULL; |
287 | 287 | _PyRuntime.interpreters.head = interp; |
288 | +interp = interp->next; | |
288 | 289 | continue; |
289 | 290 | } |
290 | 291 | |
@@ -293,7 +294,9 @@ _PyInterpreterState_DeleteExceptMain() | ||
293 | 294 | if (interp->id_mutex != NULL) { |
294 | 295 | PyThread_free_lock(interp->id_mutex); |
295 | 296 | } |
296 | -PyMem_RawFree(interp); | |
297 | +PyInterpreterState *prev_interp = interp; | |
298 | +interp = interp->next; | |
299 | +PyMem_RawFree(prev_interp); | |
297 | 300 | } |
298 | 301 | HEAD_UNLOCK(); |
299 | 302 |