From 397a509b6d0d1470df8c290d7c4adef78f1532ee Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Wed, 15 Dec 2021 01:11:45 +0900 Subject: [PATCH] prohibit load by `autoload` on non-main Ractor fix [Bug #18120] --- bootstraptest/test_ractor.rb | 11 +++++++++++ variable.c | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb index e259684974..5d9edb26d6 100644 --- a/bootstraptest/test_ractor.rb +++ b/bootstraptest/test_ractor.rb @@ -211,6 +211,17 @@ assert_equal '[:a, :b, :c, :d, :e, :f, :g]', %q{ Ractor.make_shareable(closure).call } +# Now autoload in non-main Ractor is not supported +assert_equal 'ok', %q{ + autoload :Foo, 'foo.rb' + r = Ractor.new do + p Foo + rescue Ractor::UnsafeError + :ok + end + r.take +} + ### ### # Ractor still has several memory corruption so skip huge number of tests diff --git a/variable.c b/variable.c index 87d53cdb90..c2b8146f9a 100644 --- a/variable.c +++ b/variable.c @@ -2553,6 +2553,10 @@ rb_autoload_load(VALUE mod, ID id) src = rb_sourcefile(); if (src && loading && strcmp(src, loading) == 0) return Qfalse; + if (UNLIKELY(!rb_ractor_main_p())) { + rb_raise(rb_eRactorUnsafeError, "require by autoload on non-main Ractor is not supported (%s)", rb_id2name(id)); + } + if ((ce = rb_const_lookup(mod, id))) { flag = ce->flag & (CONST_DEPRECATED | CONST_VISIBILITY_MASK); }