mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
5c2b644166
```ruby r, w = IO.pipe r.close IO.for_fd(w.fileno).close ``` This code closes a file descriptor `w.fileno`, but `w` doesn't know the closing. Another code can open same file descriptor with opening file (`f`). After that, the `w` will GCed and `w.fileno` is closed again, and `f.fileno` is closed too, so IO operations for `f` (`f.close`) will cause EBADF. To fix this issue, do this test in another process.
36 lines
693 B
Ruby
36 lines
693 B
Ruby
# frozen_string_literal: false
|
|
require 'test/unit'
|
|
|
|
class TestWait < Test::Unit::TestCase
|
|
require '-test-/wait'
|
|
|
|
def test_wait_for_valid_fd
|
|
IO.pipe do |r,w|
|
|
rc = IO.io_wait(w, IO::WRITABLE, nil)
|
|
assert_equal IO::WRITABLE, rc
|
|
end
|
|
end
|
|
|
|
def test_wait_for_invalid_fd
|
|
assert_separately [], <<~'RUBY'
|
|
require '-test-/wait'
|
|
|
|
r, w = IO.pipe
|
|
r.close
|
|
|
|
IO.for_fd(w.fileno).close
|
|
|
|
assert_raise(Errno::EBADF) do
|
|
IO.io_wait(w, IO::WRITABLE, nil)
|
|
end
|
|
RUBY
|
|
end
|
|
|
|
def test_wait_for_closed_pipe
|
|
IO.pipe do |r,w|
|
|
w.close
|
|
rc = IO.io_wait(r, IO::READABLE, nil)
|
|
assert_equal IO::READABLE, rc
|
|
end
|
|
end
|
|
end
|