diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | file.c | 1 | ||||
-rw-r--r-- | test/ruby/test_file_exhaustive.rb | 10 |
3 files changed, 15 insertions, 1 deletions
@@ -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. @@ -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) |