summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2021-10-26 11:35:57 +0900
committerKoichi Sasada <ko1@atdot.net>2021-10-26 11:39:52 +0900
commit5c2b6441660cdabf1efc745c25f2b1a41bb3b087 (patch)
treed7de515167ab14467ceb193e143b8d19dda4831d /test
parent7d4c59203ffe16a7409358f69a48768a9e6d0fb1 (diff)
fix random EBADF problem
```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.
Diffstat (limited to 'test')
-rw-r--r--test/-ext-/wait/test_wait.rb16
1 files changed, 10 insertions, 6 deletions
diff --git a/test/-ext-/wait/test_wait.rb b/test/-ext-/wait/test_wait.rb
index 79127c041b..8e53f067cf 100644
--- a/test/-ext-/wait/test_wait.rb
+++ b/test/-ext-/wait/test_wait.rb
@@ -12,14 +12,18 @@ class TestWait < Test::Unit::TestCase
end
def test_wait_for_invalid_fd
- r, w = IO.pipe
- r.close
+ assert_separately [], <<~'RUBY'
+ require '-test-/wait'
- IO.for_fd(w.fileno).close
+ r, w = IO.pipe
+ r.close
- assert_raise(Errno::EBADF) do
- IO.io_wait(w, IO::WRITABLE, nil)
- end
+ 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