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]
This commit is contained in:
parent
0164ac70a1
commit
5d7953f86b
Notes:
git
2020-09-29 00:34:32 +09:00
5
dir.c
5
dir.c
@ -1024,7 +1024,8 @@ chdir_restore(VALUE v)
|
|||||||
* block. <code>chdir</code> blocks can be nested, but in a
|
* block. <code>chdir</code> blocks can be nested, but in a
|
||||||
* multi-threaded program an error will be raised if a thread attempts
|
* multi-threaded program an error will be raised if a thread attempts
|
||||||
* to open a <code>chdir</code> block while another thread has one
|
* 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")
|
* Dir.chdir("/var/spool/mail")
|
||||||
* puts Dir.pwd
|
* puts Dir.pwd
|
||||||
@ -1064,7 +1065,7 @@ dir_s_chdir(int argc, VALUE *argv, VALUE obj)
|
|||||||
|
|
||||||
if (chdir_blocking > 0) {
|
if (chdir_blocking > 0) {
|
||||||
if (!rb_block_given_p() || rb_thread_current() != chdir_thread)
|
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()) {
|
if (rb_block_given_p()) {
|
||||||
|
@ -99,8 +99,12 @@ class TestDir < Test::Unit::TestCase
|
|||||||
ENV["HOME"] = @pwd
|
ENV["HOME"] = @pwd
|
||||||
Dir.chdir do
|
Dir.chdir do
|
||||||
assert_equal(@pwd, Dir.pwd)
|
assert_equal(@pwd, Dir.pwd)
|
||||||
Dir.chdir(@root)
|
assert_raise(RuntimeError) { Dir.chdir(@root) }
|
||||||
assert_equal(@root, Dir.pwd)
|
assert_equal(@pwd, Dir.pwd)
|
||||||
|
Dir.chdir(@root) do
|
||||||
|
assert_equal(@root, Dir.pwd)
|
||||||
|
end
|
||||||
|
assert_equal(@pwd, Dir.pwd)
|
||||||
end
|
end
|
||||||
|
|
||||||
ensure
|
ensure
|
||||||
@ -121,6 +125,28 @@ class TestDir < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
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
|
def test_chroot_nodir
|
||||||
skip if RUBY_PLATFORM =~ /android/
|
skip if RUBY_PLATFORM =~ /android/
|
||||||
assert_raise(NotImplementedError, Errno::ENOENT, Errno::EPERM
|
assert_raise(NotImplementedError, Errno::ENOENT, Errno::EPERM
|
||||||
|
Loading…
x
Reference in New Issue
Block a user