summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--file.c1
-rw-r--r--test/ruby/test_file_exhaustive.rb10
3 files changed, 15 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 40f8006c3c..60ed1d1d97 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-Tue Oct 16 10:53:29 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Oct 16 10:54:03 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_join): path names must be ASCII-compatible.
+ [ruby-core:48012] [Bug #7168]
* file.c (check_path_encoding): new function to ensure path name
encoding to be ASCII-compatible.
diff --git a/file.c b/file.c
index 22df4420be..f4ae1bb155 100644
--- a/file.c
+++ b/file.c
@@ -3924,6 +3924,7 @@ rb_file_join(VALUE ary, VALUE sep)
for (i=0; i<RARRAY_LEN(ary); i++) {
tmp = RARRAY_PTR(ary)[i];
if (RB_TYPE_P(tmp, T_STRING)) {
+ check_path_encoding(tmp);
len += RSTRING_LEN(tmp);
}
else {
diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb
index e13c98c44a..f697488192 100644
--- a/test/ruby/test_file_exhaustive.rb
+++ b/test/ruby/test_file_exhaustive.rb
@@ -772,10 +772,14 @@ class TestFileExhaustive < Test::Unit::TestCase
s = "foo" + File::SEPARATOR + "bar" + File::SEPARATOR + "baz"
assert_equal(s, File.join("foo", "bar", "baz"))
assert_equal(s, File.join(["foo", "bar", "baz"]))
+
o = Object.new
def o.to_path; "foo"; end
assert_equal(s, File.join(o, "bar", "baz"))
assert_equal(s, File.join("foo" + File::SEPARATOR, "bar", File::SEPARATOR + "baz"))
+ end
+
+ def test_join_alt_separator
if File::ALT_SEPARATOR == '\\'
a = "\225\\"
b = "foo"
@@ -785,6 +789,12 @@ class TestFileExhaustive < Test::Unit::TestCase
end
end
+ def test_join_ascii_incompatible
+ bug7168 = '[ruby-core:48012]'
+ names = %w"a b".map {|s| s.encode(Encoding::UTF_16LE)}
+ assert_raise(Encoding::CompatibilityError, bug7168) {File.join(*names)}
+ end
+
def test_truncate
assert_equal(0, File.truncate(@file, 1))
file_assertion.exist?(@file)