From e3ec101cc21613550ef87b7bd8432a69c7e639de Mon Sep 17 00:00:00 2001 From: Luke Gruber Date: Tue, 17 Jun 2025 16:56:26 -0400 Subject: [PATCH] thread_cleanup: set CFP to NULL before clearing ec's stack We clear the CFP first so that if a sampling profiler interrupts the current thread during `rb_ec_set_vm_stack`, `thread_profile_frames` returns early instead of trying to walk the stack that's no longer set on the ec. The early return in `thread_profile_frames` was introduced at eab7f4623fb. Fixes [Bug #21441] --- vm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vm.c b/vm.c index 7b0775fbb3..a8822239cf 100644 --- a/vm.c +++ b/vm.c @@ -3675,10 +3675,10 @@ rb_ec_initialize_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size) void rb_ec_clear_vm_stack(rb_execution_context_t *ec) { - rb_ec_set_vm_stack(ec, NULL, 0); - - // Avoid dangling pointers: + // set cfp to NULL before clearing the stack in case `thread_profile_frames` + // gets called in this middle of `rb_ec_set_vm_stack` via signal handler. ec->cfp = NULL; + rb_ec_set_vm_stack(ec, NULL, 0); } static void