ruby-changes:63184
From: Jeremy <ko1@a...>
Date: Tue, 29 Sep 2020 00:34:24 +0900 (JST)
Subject: [ruby-changes:63184] 5d7953f86b (master): Switch conflicting chdir warning to RuntimeError
https://git.ruby-lang.org/ruby.git/commit/?id=5d7953f86b From 5d7953f86b7ae164017e2292dfb3c108e0e02527 Mon Sep 17 00:00:00 2001 From: Jeremy Evans <code@j...> Date: Fri, 25 Sep 2020 13:29:20 -0700 Subject: Switch conflicting chdir warning to RuntimeError The documentation already stated this was an error in one case (when it was previously a warning). Describe the other case, where chdir without block is called inside block passed to chdir. Fixes [Bug #15661] diff --git a/dir.c b/dir.c index e5b6705..49e6818 100644 --- a/dir.c +++ b/dir.c @@ -1024,7 +1024,8 @@ chdir_restore(VALUE v) https://github.com/ruby/ruby/blob/trunk/dir.c#L1024 * block. <code>chdir</code> blocks can be nested, but in a * multi-threaded program an error will be raised if a thread attempts * to open a <code>chdir</code> block while another thread has one - * open. + * open or a call to <code>chdir</code> without a block occurs inside + * a block passed to <code>chdir</code> (even in the same thread). * * Dir.chdir("/var/spool/mail") * puts Dir.pwd @@ -1064,7 +1065,7 @@ dir_s_chdir(int argc, VALUE *argv, VALUE obj) https://github.com/ruby/ruby/blob/trunk/dir.c#L1065 if (chdir_blocking > 0) { if (!rb_block_given_p() || rb_thread_current() != chdir_thread) - rb_warn("conflicting chdir during another chdir block"); + rb_raise(rb_eRuntimeError, "conflicting chdir during another chdir block"); } if (rb_block_given_p()) { diff --git a/test/ruby/test_dir.rb b/test/ruby/test_dir.rb index 13b9c1d..cf18af1 100644 --- a/test/ruby/test_dir.rb +++ b/test/ruby/test_dir.rb @@ -99,8 +99,12 @@ class TestDir < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dir.rb#L99 ENV["HOME"] = @pwd Dir.chdir do assert_equal(@pwd, Dir.pwd) - Dir.chdir(@root) - assert_equal(@root, Dir.pwd) + assert_raise(RuntimeError) { Dir.chdir(@root) } + assert_equal(@pwd, Dir.pwd) + Dir.chdir(@root) do + assert_equal(@root, Dir.pwd) + end + assert_equal(@pwd, Dir.pwd) end ensure @@ -121,6 +125,28 @@ class TestDir < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dir.rb#L125 end end + def test_chdir_conflict + @pwd = Dir.pwd + q = Queue.new + t = Thread.new do + q.pop + Dir.chdir(@pwd) rescue $! + end + Dir.chdir(@pwd) do + q.push nil + assert_instance_of(RuntimeError, t.value) + end + + t = Thread.new do + q.pop + Dir.chdir(@pwd){} rescue $! + end + Dir.chdir(@pwd) do + q.push nil + assert_instance_of(RuntimeError, t.value) + end + end + def test_chroot_nodir skip if RUBY_PLATFORM =~ /android/ assert_raise(NotImplementedError, Errno::ENOENT, Errno::EPERM -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/