Project

General

Profile

Bug #19624

Updated by pineman (João Pinheiro) over 1 year ago

Hi, 

 This code works on ruby 3.0.6: 

 ```ruby 
 `echo` 
 ObjectSpace.each_object(IO) do |io| 
   if ![STDIN, STDOUT, STDERR].include?(io) 
     io.close 
   end 
 end 
 ``` 
 but raises `IOError` on 3.2.2: 
 ``` 
 minimal-repro-case.rb:8:in `close': uninitialized stream (IOError) 
 ``` 


 I found it started failing on ruby 3.1.0 and after, on macOS and Linux. 
 This code is useful for closing unneeded IO objects in forked processes. 
 It looks like backticks is 'leaking' IO objects, waiting for GC, and it didn't used to before 3.1.0. 
 In ruby 3.1.0, inside `rb_f_backquote` in `io.c`, `rb_gc_force_recycle` was removed in favor of `RB_GC_GUARD` (commit `aeae6e2842e`). `RB_GC_GUARD`. I wonder if this has something to do with the problem. 
 Is this code incorrect since ruby 3.1.0 or is it a bug in ruby? 
 Thanks.

Back