aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--lib/find.rb23
-rw-r--r--test/test_find.rb9
3 files changed, 25 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 1cc0efc950..9eeec203f1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 16a6a26069..7727bbdbbc 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 7e9f21fdd4..6f61dd4f38 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")