[#122258] [Ruby Misc#21367] Remove link to ruby-doc.org from www.ruby-lang.org/en/documentation/ — "p8 (Petrik de Heus) via ruby-core" <ruby-core@...>
Issue #21367 has been reported by p8 (Petrik de Heus).
11 messages
2025/05/23
[ruby-core:122109] [Ruby Bug#17420] Unsafe mutation of $" when doing non-RubyGems require in Ractor
From:
"Eregon (Benoit Daloze) via ruby-core" <ruby-core@...>
Date:
2025-05-14 18:52:19 UTC
List:
ruby-core #122109
Issue #17420 has been updated by Eregon (Benoit Daloze).
Yep, the original ticket was about incorrectly allowing `require` in Ractors and that could segfault.
https://github.com/ruby/ruby/pull/11142 is the proper fix.
----------------------------------------
Bug #17420: Unsafe mutation of $" when doing non-RubyGems require in Ractor
https://bugs.ruby-lang.org/issues/17420#change-113262
* Author: Eregon (Benoit Daloze)
* Status: Closed
* Assignee: ractor
* ruby -v: ruby 3.0.0dev (2020-12-16T10:12:48Z master a9a7f4d8b8) [x86_64-linux]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
With an empty file `a.rb`:
```
$ ruby --disable-gems -e 'Ractor.new { puts $" }.take'
-e:1:in `block in <main>': can not access global variables $" from non-main Ractors (RuntimeError)
```
That is expected, given the rules for global variables.
```
ruby --disable-gems -e 'Ractor.new { require "./a.rb"; }.take; p $"'
[... , "/home/eregon/a.rb"]
```
Is it OK that the Ractor can do `require`, which does modify `$"`?
I think it's not, and it might lead to segfaults if e.g. the main Ractor mutates `$"` in parallel to some other Ractor doing `require`.
Probably `require` needs to be forbidden in non-main Ractors (it does mutate `$"`, so it's logical), or there needs to be always VM-global synchronization on any access to `$"` (otherwise, segfaults are possible).
The latter doesn't seem reasonable, especially when considering the user might do `$".each { ... }`.
---
Note that RubyGems' `require` does not work on non-main Ractors (pretty much expected given it depends on a lot of global state):
```
$ ruby -e 'Ractor.new { require "./a.rb"; }.take'
<internal:/home/eregon/prefix/ruby-master/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:37:in `require': can not access non-shareable objects in constant Kernel::RUBYGEMS_ACTIVATION_MONITOR by non-main ractor. (NameError)
```
This probably also has consequences for `autoload`.
Maybe the `zeitwerk` gem can help with the mode to resolve all autoload at once.
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/