aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/tmpdir.rb15
-rw-r--r--test/test_tmpdir.rb8
2 files changed, 15 insertions, 8 deletions
diff --git a/lib/tmpdir.rb b/lib/tmpdir.rb
index e6cb327fc7..0b1f00aecf 100644
--- a/lib/tmpdir.rb
+++ b/lib/tmpdir.rb
@@ -20,14 +20,21 @@ class Dir
def self.tmpdir
tmp = nil
- [ENV['TMPDIR'], ENV['TMP'], ENV['TEMP'], @@systmpdir, '/tmp', '.'].each do |dir|
+ ['TMPDIR', 'TMP', 'TEMP', ['system temporary path', @@systmpdir], ['/tmp']*2, ['.']*2].each do |name, dir = ENV[name]|
next if !dir
dir = File.expand_path(dir)
- if stat = File.stat(dir) and stat.directory? and stat.writable? and
- (!stat.world_writable? or stat.sticky?)
+ stat = File.stat(dir) rescue next
+ case
+ when !stat.directory?
+ warn "#{name} is not a directory: #{dir}"
+ when !stat.writable?
+ warn "#{name} is not writable: #{dir}"
+ when stat.world_writable? && !stat.sticky?
+ warn "#{name} is world-writable: #{dir}"
+ else
tmp = dir
break
- end rescue nil
+ end
end
raise ArgumentError, "could not find a temporary directory" unless tmp
tmp
diff --git a/test/test_tmpdir.rb b/test/test_tmpdir.rb
index 7cee2e1d9f..c56fd5f401 100644
--- a/test/test_tmpdir.rb
+++ b/test/test_tmpdir.rb
@@ -21,16 +21,16 @@ class TestTmpdir < Test::Unit::TestCase
envs.each do |e|
tmpdirx = File.join(tmpdir, e)
ENV[e] = tmpdirx
- assert_not_equal(tmpdirx, Dir.tmpdir)
+ assert_not_equal(tmpdirx, assert_warn('') {Dir.tmpdir})
File.write(tmpdirx, "")
- assert_not_equal(tmpdirx, Dir.tmpdir)
+ assert_not_equal(tmpdirx, assert_warn(/not a directory/) {Dir.tmpdir})
File.unlink(tmpdirx)
ENV[e] = tmpdir
assert_equal(tmpdir, Dir.tmpdir)
File.chmod(0555, tmpdir)
- assert_not_equal(tmpdir, Dir.tmpdir)
+ assert_not_equal(tmpdir, assert_warn(/not writable/) {Dir.tmpdir})
File.chmod(0777, tmpdir)
- assert_not_equal(tmpdir, Dir.tmpdir)
+ assert_not_equal(tmpdir, assert_warn(/world-writable/) {Dir.tmpdir})
newdir = Dir.mktmpdir("d", tmpdir) do |dir|
assert_file.directory? dir
assert_equal(tmpdir, File.dirname(dir))