diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-10-10 06:22:30 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-10-10 06:22:30 +0000 |
commit | 8c3af8ecc078704128cda961b5316162506e1eb1 (patch) | |
tree | 4f9388417afcdfe816be26a1dafa354128865606 /test | |
parent | a28d3d591dc6a37cb2544d529a888a99c63e4328 (diff) | |
download | ruby-8c3af8ecc078704128cda961b5316162506e1eb1.tar.gz |
ruby.c: bind fd before waiting
* ruby.c (open_load_file): bind the open fd to an IO instance
before waiting FIFO, not to leak the fd if interrupted.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56388 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r-- | test/ruby/test_require.rb | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb index b5802e71c4..5c2221c77b 100644 --- a/test/ruby/test_require.rb +++ b/test/ruby/test_require.rb @@ -757,6 +757,26 @@ class TestRequire < Test::Unit::TestCase } end if File.respond_to?(:mkfifo) + def test_loading_fifo_fd_leak + Tempfile.create(%w'fifo .rb') {|f| + f.close + File.unlink(f.path) + File.mkfifo(f.path) + assert_separately(["-", f.path], "#{<<-"begin;"}\n#{<<-"end;"}", timeout: 3) + begin; + Process.setrlimit(Process::RLIMIT_NOFILE, 50) + th = Thread.current + 100.times do |i| + Thread.start {begin sleep(0.001) end until th.stop?; th.raise(IOError)} + assert_raise(IOError, "\#{i} time") do + tap {tap {tap {load(ARGV[0])}}} + end + GC.start + end + end; + } + end if File.respond_to?(:mkfifo) and defined?(Process::RLIMIT_NOFILE) + def test_throw_while_loading Tempfile.create(%w'bug-11404 .rb') do |f| f.puts 'sleep' |