mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
cont.c: set th->root_fiber to current fiber at fork
Otherwise, th->root_fiber can point to an invalid Fiber, because Fibers do not live across fork. So consider whatever Fiber is running the root fiber. [ruby-core:88723] [Bug #15041] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64589 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
43d3f813bc
commit
ac543abe91
3 changed files with 19 additions and 1 deletions
12
cont.c
12
cont.c
|
@ -1977,6 +1977,18 @@ fiber_to_s(VALUE fibval)
|
||||||
return rb_block_to_s(fibval, &proc->block, status_info);
|
return rb_block_to_s(fibval, &proc->block, status_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_WORKING_FORK
|
||||||
|
void
|
||||||
|
rb_fiber_atfork(rb_thread_t *th)
|
||||||
|
{
|
||||||
|
if (&th->root_fiber->cont.saved_ec != th->ec) {
|
||||||
|
th->root_fiber = th->ec->fiber_ptr;
|
||||||
|
th->root_fiber->cont.type = ROOT_FIBER_CONTEXT;
|
||||||
|
}
|
||||||
|
th->root_fiber->prev = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Document-class: FiberError
|
* Document-class: FiberError
|
||||||
*
|
*
|
||||||
|
|
|
@ -269,7 +269,11 @@ class TestFiber < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
bug5700 = '[ruby-core:41456]'
|
bug5700 = '[ruby-core:41456]'
|
||||||
assert_nothing_raised(bug5700) do
|
assert_nothing_raised(bug5700) do
|
||||||
Fiber.new{ pid = fork {} }.resume
|
Fiber.new do
|
||||||
|
pid = fork do
|
||||||
|
Fiber.new {}.transfer
|
||||||
|
end
|
||||||
|
end.resume
|
||||||
end
|
end
|
||||||
pid, status = Process.waitpid2(pid)
|
pid, status = Process.waitpid2(pid)
|
||||||
assert_equal(0, status.exitstatus, bug5700)
|
assert_equal(0, status.exitstatus, bug5700)
|
||||||
|
|
2
thread.c
2
thread.c
|
@ -4381,6 +4381,7 @@ terminate_atfork_i(rb_thread_t *th, const rb_thread_t *current_th)
|
||||||
|
|
||||||
/* mjit.c */
|
/* mjit.c */
|
||||||
void mjit_child_after_fork(void);
|
void mjit_child_after_fork(void);
|
||||||
|
void rb_fiber_atfork(rb_thread_t *);
|
||||||
void
|
void
|
||||||
rb_thread_atfork(void)
|
rb_thread_atfork(void)
|
||||||
{
|
{
|
||||||
|
@ -4388,6 +4389,7 @@ rb_thread_atfork(void)
|
||||||
rb_thread_atfork_internal(th, terminate_atfork_i);
|
rb_thread_atfork_internal(th, terminate_atfork_i);
|
||||||
th->join_list = NULL;
|
th->join_list = NULL;
|
||||||
rb_mutex_cleanup_keeping_mutexes(th);
|
rb_mutex_cleanup_keeping_mutexes(th);
|
||||||
|
rb_fiber_atfork(th);
|
||||||
|
|
||||||
/* We don't want reproduce CVE-2003-0900. */
|
/* We don't want reproduce CVE-2003-0900. */
|
||||||
rb_reset_random_seed();
|
rb_reset_random_seed();
|
||||||
|
|
Loading…
Reference in a new issue