summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--file.c7
-rw-r--r--test/ruby/test_file.rb8
3 files changed, 20 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 9b64ace405..5af16c0cef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat May 26 16:26:30 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (realpath_rec): UNC prefix does not end with path separator,
+ so new separator is needed after it.
+
Sat May 26 15:29:22 2012 Koichi Sasada <ko1@atdot.net>
* test/ruby/test_backtrace.rb (test_caller_lev):
diff --git a/file.c b/file.c
index bb1ab371f8..846f3147f9 100644
--- a/file.c
+++ b/file.c
@@ -3350,6 +3350,13 @@ realpath_rec(long *prefixlenp, VALUE *resolvedp, const char *unresolved, VALUE l
VALUE testpath = rb_str_dup(*resolvedp);
if (*prefixlenp < RSTRING_LEN(testpath))
rb_str_cat2(testpath, "/");
+#if defined(DOSISH_UNC) || defined(DOSISH_DRIVE_LETTER)
+ if (*prefixlenp > 1 && *prefixlenp == RSTRING_LEN(testpath)) {
+ const char *prefix = RSTRING_PTR(testpath);
+ const char *last = rb_enc_left_char_head(prefix, prefix + *prefixlenp - 1, prefix + *prefixlenp, enc);
+ if (!isdirsep(*last)) rb_str_cat2(testpath, "/");
+ }
+#endif
rb_str_cat(testpath, testname, testnamelen);
checkval = rb_hash_aref(loopcheck, testpath);
if (!NIL_P(checkval)) {
diff --git a/test/ruby/test_file.rb b/test/ruby/test_file.rb
index b9c2210bdf..b0a6971e69 100644
--- a/test/ruby/test_file.rb
+++ b/test/ruby/test_file.rb
@@ -231,6 +231,14 @@ class TestFile < Test::Unit::TestCase
assert_equal(realdir, File.realdirpath(".", tst))
assert_equal(File.join(realdir, "foo"), File.realdirpath("foo", tst))
}
+ begin
+ result = File.realdirpath("bar", "//:/foo")
+ rescue SystemCallError
+ else
+ if result.start_with?("//")
+ assert_equal("//:/foo/bar", result)
+ end
+ end
end
def test_utime_with_minus_time_segv