Project

General

Profile

Actions

Bug #19624

closed

Backticks - IO object leakage

Added by pineman (João Pinheiro) about 1 year ago. Updated 8 months ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [arm64-darwin22]
[ruby-core:113381]

Description

Hi,

This code works on ruby 3.0.6:

`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). 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.


Files

minimal-repro-case.rb (109 Bytes) minimal-repro-case.rb Minimal reproduction case pineman (João Pinheiro), 04/30/2023 02:56 PM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0