From ef276e959ec8a8ad0b7683176e2943058335f55c Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 29 Oct 2014 05:44:33 +0000 Subject: load.c: transcode path * load.c (rb_f_load): path name needs to be transcoded to OS path encoding. [ruby-list:49994] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48186 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ load.c | 8 +++++--- test/ruby/test_require.rb | 22 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index c5a72d19af..a2c8f5bd0e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed Oct 29 14:44:27 2014 Nobuyoshi Nakada + + * load.c (rb_f_load): path name needs to be transcoded to OS path + encoding. [ruby-list:49994] + Wed Oct 29 11:48:23 2014 Nobuyoshi Nakada * configure.in (__builtin_setjmp): disable with gcc/clang earlier diff --git a/load.c b/load.c index 3f5372c064..e6a7be4a67 100644 --- a/load.c +++ b/load.c @@ -683,7 +683,7 @@ rb_load_protect(VALUE fname, int wrap, int *state) static VALUE rb_f_load(int argc, VALUE *argv) { - VALUE fname, wrap, path; + VALUE fname, wrap, path, orig_fname; rb_scan_args(argc, argv, "11", &fname, &wrap); @@ -693,10 +693,12 @@ rb_f_load(int argc, VALUE *argv) rb_sourceline()); } - path = rb_find_file(FilePathValue(fname)); + orig_fname = FilePathValue(fname); + fname = rb_str_encode_ospath(orig_fname); + path = rb_find_file(fname); if (!path) { if (!rb_file_load_ok(RSTRING_PTR(fname))) - load_failed(fname); + load_failed(orig_fname); path = fname; } rb_load_internal(path, RTEST(wrap)); diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb index 5b299f4228..971140afff 100644 --- a/test/ruby/test_require.rb +++ b/test/ruby/test_require.rb @@ -308,6 +308,28 @@ class TestRequire < Test::Unit::TestCase } end + def test_load_ospath + bug = '[ruby-list:49994] path in ospath' + base = "test_load\u{3042 3044 3046 3048 304a}".encode(Encoding::Windows_31J) + path = nil + Tempfile.create([base, ".rb"]) do |t| + path = t.path + + assert_raise_with_message(LoadError, /#{base}/) { + load(File.join(File.dirname(path), base)) + } + + t.puts "warn 'ok'" + t.close + assert_include(path, base) + assert_warn("ok\n", bug) { + assert_nothing_raised(LoadError, bug) { + load(path) + } + } + end + end + def test_tainted_loadpath Tempfile.create(["test_ruby_test_require", ".rb"]) {|t| abs_dir, file = File.split(t.path) -- cgit v1.2.3