summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--load.c3
-rw-r--r--test/ruby/test_exception.rb2
-rw-r--r--test/ruby/test_require.rb14
3 files changed, 17 insertions, 2 deletions
diff --git a/load.c b/load.c
index 1b9dd48150..1d3ff23d55 100644
--- a/load.c
+++ b/load.c
@@ -85,7 +85,8 @@ rb_construct_expanded_load_path(enum expand_type type, int *has_relative, int *h
if (is_string)
rb_str_freeze(path);
as_str = rb_get_path_check_convert(path, as_str, level);
- expanded_path = rb_file_expand_path_fast(as_str, Qnil);
+ expanded_path = rb_check_realpath(Qnil, as_str);
+ if (NIL_P(expanded_path)) expanded_path = as_str;
rb_ary_push(ary, rb_fstring(expanded_path));
}
rb_obj_freeze(ary);
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb
index 6955118de7..bcad728789 100644
--- a/test/ruby/test_exception.rb
+++ b/test/ruby/test_exception.rb
@@ -1019,7 +1019,7 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status|
warning = nil
path = nil
Tempfile.create(%w[circular .rb]) do |t|
- path = t.path
+ path = File.realpath(t.path)
basename = File.basename(path)
t.puts "require '#{basename}'"
t.close
diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb
index 1bed6c4f64..28cf686a26 100644
--- a/test/ruby/test_require.rb
+++ b/test/ruby/test_require.rb
@@ -881,4 +881,18 @@ class TestRequire < Test::Unit::TestCase
end;
end
end
+
+ def test_symlink_load_path
+ Dir.mktmpdir {|tmp|
+ Dir.mkdir(File.join(tmp, "real"))
+ begin
+ File.symlink "real", File.join(tmp, "symlink")
+ rescue NotImplementedError, Errno::EACCES
+ skip "File.symlink is not implemented"
+ end
+ File.write(File.join(tmp, "real/a.rb"), "print __FILE__")
+ result = IO.popen([EnvUtil.rubybin, "-I#{tmp}/symlink", "-e", "require 'a.rb'"], &:read)
+ assert_operator(result, :end_with?, "/real/a.rb")
+ }
+ end
end