Project

General

Profile

Bug #21115

Updated by Eregon (Benoit Daloze) 3 days ago

```ruby 
 require 'etc' 

 20.times.map do 
   Ractor.new do 
     1000.times do 
       raise unless Etc.getgrgid(Process.gid).gid == Process.gid 
     end 
   end 
 end.each(&:take) 
 ``` 

 Running it a few times gives a segfault: 
 ``` 
 $ ruby ractor_getgrgid.rb 
 ractor_getgrgid.rb:4: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues. 
 #<Thread:0x00007f251b7d0478 run> terminated with exception (report_on_exception is true): 
 ractor_getgrgid.rb:6:in 'block (3 levels) in <main>': unhandled exception 
	 from <internal:numeric>:257:in 'Integer#times' 
	 from ractor_getgrgid.rb:5:in 'block (2 levels) in <main>' 
 #<Thread:0x00007f251b7dde70 run> terminated with exception (report_on_exception is true): 
 ractor_getgrgid.rb:6:in 'block (3 levels) in <main>': unhandled exception 
	 from <internal:numeric>:257:in 'Integer#times' 
	 from ractor_getgrgid.rb:5:in 'block (2 levels) in <main>' 
 ractor_getgrgid.rb:6: [BUG] Segmentation fault at 0x00000000706d7564 
 ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [x86_64-linux] 

 -- Control frame information ----------------------------------------------- 
 c:0005 p:---- s:0019 e:000018 CFUNC    :getgrgid 
 c:0004 p:0009 s:0014 e:000013 BLOCK    ractor_getgrgid.rb:6 
 c:0003 p:0024 s:0011 e:000010 METHOD <internal:numeric>:257 
 c:0002 p:0005 s:0006 e:000005 BLOCK    ractor_getgrgid.rb:5 [FINISH] 
 c:0001 p:---- s:0003 e:000002 DUMMY    [FINISH] 
 ``` 

 Etc is marked as Ractor-safe since https://github.com/ruby/ruby/pull/3954. 
 But that is not correct, etc.c uses many C functions which are not thread-safe, such as `getgrgid()`. 

 Also filed as https://github.com/ruby/etc/issues/50

Back