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 eab7f4623f.

Fixes [Bug #21441]
This commit is contained in:
Luke Gruber 2025-06-17 16:56:26 -04:00 committed by Aaron Patterson
parent b066260296
commit e3ec101cc2
Notes: git 2025-06-17 22:03:51 +00:00

6
vm.c
View file

@ -3675,10 +3675,10 @@ rb_ec_initialize_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size)
void void
rb_ec_clear_vm_stack(rb_execution_context_t *ec) rb_ec_clear_vm_stack(rb_execution_context_t *ec)
{ {
rb_ec_set_vm_stack(ec, NULL, 0); // 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.
// Avoid dangling pointers:
ec->cfp = NULL; ec->cfp = NULL;
rb_ec_set_vm_stack(ec, NULL, 0);
} }
static void static void