diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-27 08:26:47 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-27 08:26:47 +0000 |
commit | b3d126d5dea5dbfacc0cd77de12c6482e1c9e360 (patch) | |
tree | f0dfa5acfa8ba15d3b12ebfb22dbe80f2a007137 /test | |
parent | 71dca4b60dafa87601df4ded2847411bb5b598da (diff) | |
download | ruby-b3d126d5dea5dbfacc0cd77de12c6482e1c9e360.tar.gz |
rb_wait_for_single_fd: do not OOM or segfault with invalid FD on select()
Instead, match the poll() implementation used on Linux for now;
as the Linux poll(2) manpage describes using negative FD to
easily ignore an FD in a larger FD set while (sleeping the given
timeout). I'm not entirely sure if matching poll() behavior
is a good idea for a single FD, but it's better than segfaulting
or NoMemoryError.
* thread.c (init_set_fd): ignore negative FD
* test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb
(test_wait_for_invalid_fd): check values which may trigger
segfaults or OOM
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58925 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r-- | test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb b/test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb index d7bc827a6e..1141dd317c 100644 --- a/test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb +++ b/test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb @@ -22,6 +22,13 @@ class TestWaitForSingleFD < Test::Unit::TestCase end def test_wait_for_invalid_fd + # Negative FDs should not cause NoMemoryError or segfault when + # using select(). For now, match the poll() implementation + # used on Linux, which sleeps the given amount of time given + # when fd is negative (as documented in the Linux poll(2) manpage) + assert_equal 0, IO.wait_for_single_fd(-999, RB_WAITFD_IN, 0) + assert_equal 0, IO.wait_for_single_fd(-1, RB_WAITFD_OUT, 0) + # FreeBSD 8.2 or prior sticks this # http://bugs.ruby-lang.org/issues/5524 skip if /freebsd[1-8]/ =~ RUBY_PLATFORM |