summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--dir.c5
-rw-r--r--file.c1
-rw-r--r--test/ruby/test_dir.rb5
-rw-r--r--test/ruby/test_file_exhaustive.rb14
5 files changed, 29 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index e608047703..c93345a46f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/dir.c b/dir.c
index 293386349e..a71f5825fd 100644
--- a/dir.c
+++ b/dir.c
@@ -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)
diff --git a/file.c b/file.c
index b872002c2f..ef7ad0e777 100644
--- a/file.c
+++ b/file.c
@@ -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