summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/fileutils.rb13
-rw-r--r--test/fileutils/test_fileutils.rb9
3 files changed, 26 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 200fffff82..e6244cbd46 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jul 20 12:27:56 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/fileutils.rb (FileUtils::Entry_#copy): check file name
+ spearator boundary. [ruby-core:31360]
+
Mon Jul 19 18:34:12 2010 Tanaka Akira <akr@fsij.org>
* ext/pathname/pathname.c (get_strpath): check the type.
diff --git a/lib/fileutils.rb b/lib/fileutils.rb
index 5905022c96..73e2bfe3c3 100644
--- a/lib/fileutils.rb
+++ b/lib/fileutils.rb
@@ -1240,7 +1240,7 @@ module FileUtils
when file?
copy_file dest
when directory?
- if !File.exist?(dest) and /^#{Regexp.quote(path)}/ =~ File.dirname(dest)
+ if !File.exist?(dest) and descendant_diretory?(dest, path)
raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest]
end
begin
@@ -1394,6 +1394,17 @@ module FileUtils
return File.path(base) if not dir or dir == '.'
File.join(dir, base)
end
+
+ if File::ALT_SEPARATOR
+ DIRECTORY_TERM = "(?=[/#{Regexp.quote(File::ALT_SEPARATOR)}]|\\z)".freeze
+ else
+ DIRECTORY_TERM = "(?=/|\\z)".freeze
+ end
+ SYSCASE = File::FNM_SYSCASE.nonzero? ? "-i" : ""
+
+ def descendant_diretory?(descendant, ascendant)
+ /\A(?#{SYSCASE}:#{Regexp.quote(ascendant)})#{DIRECTORY_TERM}/ =~ File.dirname(descendant)
+ end
end # class Entry_
def fu_list(arg) #:nodoc:
diff --git a/test/fileutils/test_fileutils.rb b/test/fileutils/test_fileutils.rb
index f385589d0a..494204ced5 100644
--- a/test/fileutils/test_fileutils.rb
+++ b/test/fileutils/test_fileutils.rb
@@ -286,6 +286,15 @@ class TestFileUtils
assert_directory 'tmp/cpr_dest/d'
my_rm_rf 'tmp/cpr_src'
my_rm_rf 'tmp/cpr_dest'
+
+ bug3588 = '[ruby-core:31360]'
+ assert_nothing_raised(ArgumentError, bug3588) do
+ cp_r 'tmp', 'tmp2'
+ end
+ assert_directory 'tmp2/tmp'
+ assert_raise(ArgumentError, bug3588) do
+ cp_r 'tmp2', 'tmp2/new_tmp2'
+ end
end
def test_cp_r_symlink