diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | dir.c | 5 | ||||
-rw-r--r-- | file.c | 1 | ||||
-rw-r--r-- | test/ruby/test_dir.rb | 5 | ||||
-rw-r--r-- | test/ruby/test_file_exhaustive.rb | 14 |
5 files changed, 29 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Sat Sep 19 17:32:59 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * dir.c (GlobPathValue), file.c (rb_get_path_check): path names + must be ASCII compatible. + Sat Sep 19 00:02:19 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> * include/ruby/ruby.h (rb_type): forward declaration to suppress a @@ -343,7 +343,10 @@ static VALUE dir_close(VALUE); /* can contain null bytes as separators */ \ (!RB_TYPE_P(str, T_STRING) ? \ FilePathValue(str) : \ - (safe) ? (rb_check_safe_obj(str), (str)) : (str)) + (check_safe_glob(str, safe), \ + check_glob_encoding(str), (str))) +#define check_safe_glob(str, safe) ((safe) ? rb_check_safe_obj(str) : (void)0) +#define check_glob_encoding(str) rb_enc_check((str), rb_enc_from_encoding(rb_usascii_encoding())) static VALUE dir_s_alloc(VALUE klass) @@ -127,6 +127,7 @@ rb_get_path_check(VALUE obj, int level) if (obj != tmp && insecure_obj_p(tmp, level)) { rb_insecure_operation(); } + rb_enc_check(tmp, rb_enc_from_encoding(rb_usascii_encoding())); return rb_str_new4(tmp); } diff --git a/test/ruby/test_dir.rb b/test/ruby/test_dir.rb index 0ea28f55d8..eb315d3d85 100644 --- a/test/ruby/test_dir.rb +++ b/test/ruby/test_dir.rb @@ -161,6 +161,11 @@ class TestDir < Test::Unit::TestCase Dir.glob(File.join(@root, '{\{\},a}'))) assert_equal([], Dir.glob(File.join(@root, '['))) assert_equal([], Dir.glob(File.join(@root, '[a-\\'))) + + d = "\u{3042}\u{3044}".encode("utf-16le") + assert_raise(Encoding::CompatibilityError) {Dir.glob(d)} + m = Class.new {define_method(:to_path) {d}} + assert_raise(Encoding::CompatibilityError) {Dir.glob(m.new)} end def test_foreach diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb index 881edb57ac..e7d60960b8 100644 --- a/test/ruby/test_file_exhaustive.rb +++ b/test/ruby/test_file_exhaustive.rb @@ -3,6 +3,13 @@ require "fileutils" require "tmpdir" class TestFileExhaustive < Test::Unit::TestCase + def assert_incompatible_encoding + d = "\u{3042}\u{3044}".encode("utf-16le") + assert_raise(Encoding::CompatibilityError) {yield d} + m = Class.new {define_method(:to_path) {d}} + assert_raise(Encoding::CompatibilityError) {yield m.new} + end + def setup @dir = Dir.mktmpdir("rubytest-file") File.chown(-1, Process.gid, @dir) @@ -388,6 +395,8 @@ class TestFileExhaustive < Test::Unit::TestCase assert_kind_of(String, File.expand_path("~")) assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha") } assert_raise(ArgumentError) { File.expand_path("~foo_bar_baz_unknown_user_wahaha", "/") } + + assert_incompatible_encoding {|d| File.expand_path(d)} end def test_basename @@ -412,11 +421,14 @@ class TestFileExhaustive < Test::Unit::TestCase assert_equal(basename, File.basename(@file + ".", ".*")) assert_equal(basename, File.basename(@file + "::$DATA", ".*")) end + + assert_incompatible_encoding {|d| File.basename(d)} end def test_dirname assert(@file.start_with?(File.dirname(@file))) assert_equal(".", File.dirname("")) + assert_incompatible_encoding {|d| File.dirname(d)} end def test_extname @@ -440,6 +452,8 @@ class TestFileExhaustive < Test::Unit::TestCase end end end + + assert_incompatible_encoding {|d| File.extname(d)} end def test_split |