From f1b7424cbed00a27532a053949f524eaaf4be1ba Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Fri, 22 Dec 2023 12:15:22 -0800 Subject: FREE_AT_EXIT: Don't free main stack post-fork When a forked process was started in a thread, this would result in a double-free during the child process exit. RUBY_FREE_AT_EXIT=1 ./miniruby -e 'Thread.new { fork { } }.join; Process.waitpid' This is because the main thread in the forked process was not the initial VM thread, and the new thread's stack was freed as part of objectspace iteration. This change also allows rb_threadptr_root_fiber_release to run without EC being available. --- cont.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'cont.c') diff --git a/cont.c b/cont.c index e345ac42c1..2b60860edd 100644 --- a/cont.c +++ b/cont.c @@ -2587,12 +2587,12 @@ rb_threadptr_root_fiber_release(rb_thread_t *th) /* ignore. A root fiber object will free th->ec */ } else { - rb_execution_context_t *ec = GET_EC(); + rb_execution_context_t *ec = rb_current_execution_context(false); VM_ASSERT(th->ec->fiber_ptr->cont.type == FIBER_CONTEXT); VM_ASSERT(th->ec->fiber_ptr->cont.self == 0); - if (th->ec == ec) { + if (ec && th->ec == ec) { rb_ractor_set_current_ec(th->ractor, NULL); } fiber_free(th->ec->fiber_ptr); -- cgit v1.2.3