diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | lib/find.rb | 23 | ||||
-rw-r--r-- | test/test_find.rb | 9 |
3 files changed, 25 insertions, 11 deletions
@@ -1,3 +1,7 @@ +Mon Dec 14 21:49:30 2009 Tanaka Akira <akr@fsij.org> + + * lib/find.rb (Find.find): narrow rescue region. + Mon Dec 14 09:20:54 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> * lib/find.rb (Find.find): removed already unnecessary code. diff --git a/lib/find.rb b/lib/find.rb index 16a6a2606..7727bbdbb 100644 --- a/lib/find.rb +++ b/lib/find.rb @@ -44,18 +44,19 @@ module Find rescue SystemCallError next end - begin - if s.directory? then + if s.directory? then + begin fs = Dir.entries(file) - fs.sort! - fs.reverse_each {|f| - next if f == "." or f == ".." - f = File.join(file, f) - paths.unshift f.untaint - } - end - rescue Errno::ENOENT, Errno::EACCES - end + rescue Errno::ENOENT, Errno::EACCES + next + end + fs.sort! + fs.reverse_each {|f| + next if f == "." or f == ".." + f = File.join(file, f) + paths.unshift f.untaint + } + end end end end diff --git a/test/test_find.rb b/test/test_find.rb index 7e9f21fdd..6f61dd4f3 100644 --- a/test/test_find.rb +++ b/test/test_find.rb @@ -127,6 +127,15 @@ class TestFind < Test::Unit::TestCase } end + def test_dangling_symlink_stat_error + Dir.mktmpdir {|d| + File.symlink("foo", "#{d}/bar") + assert_raise(Errno::ENOENT) { + Find.find(d) {|f| File.stat(f) } + } + } + end + def test_enumerator Dir.mktmpdir {|d| File.open("#{d}/a", "w") |