From f2d07eb82dd00174c15a10cd9a2e1bcdc0eb668e Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 14 Feb 2003 16:09:07 +0000 Subject: * file.c (file_expand_path): fix surplus path separators while expanding at root directory. [ruby-dev:19572] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3495 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ file.c | 39 ++++++++++++++++++++++----------------- sample/test.rb | 13 +++++++++++++ 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2ab85c3904..d80b63aeca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Feb 15 01:01:45 2003 Nobuyoshi Nakada + + * file.c (file_expand_path): fix surplus path separators while + expanding at root directory. [ruby-dev:19572] + Fri Feb 14 14:25:24 2003 akira yamada * lib/uri/generic.rb, lib/uri/ldap.rb, lib/uri/mailto.ldap: all foo=() diff --git a/file.c b/file.c index 9996423dd3..165e6eeec2 100644 --- a/file.c +++ b/file.c @@ -1577,6 +1577,17 @@ file_expand_path(fname, dname, result) tainted = 1; getcwd(buf, MAXPATHLEN); p = &buf[2]; + if (!isdirsep(*p)) { + while (*p && !isdirsep(*p)) { + p = CharNext(p); + } + if (*p) { + p++; + while (*p && !isdirsep(*p)) { + p = CharNext(p); + } + } + } b = s; while (*s && !isdirsep(*s)) { s = CharNext(s); @@ -1598,15 +1609,18 @@ file_expand_path(fname, dname, result) strcpy(buf, dir); free(dir); } - p = chompdirsep(skiproot(buf)); + p = skiproot(buf); + if (*p) + p = chompdirsep(p); + else + --p; } else { - while (*s && isdirsep(*s)) { - *p++ = '/'; - BUFCHECK(p >= pend); - s++; - } - if (p > buf && *s) p--; + b = s; + do s++; while (isdirsep(*s)); + p = buf + (s - b) - 1; + BUFCHECK(p >= pend); + memset(buf, '/', p - buf); } *p = '/'; @@ -1667,16 +1681,7 @@ file_expand_path(fname, dname, result) memcpy(++p, b, s-b); p += s-b; } -#ifdef DOSISH_DRIVE_LETTER - else if (ISALPHA(buf[0]) && (buf[1] == ':') && isdirsep(buf[2])) { - /* root directory needs a trailing backslash, - otherwise it mean the current directory of the drive */ - if (p == (buf+2)) p++; - } - else if (isdirsep(buf[0]) && isdirsep(buf[1])) { - if (p == (buf+1)) p++; - } -#endif + if (p == skiproot(buf) - 1) p++; if (tainted) OBJ_TAINT(result); RSTRING(result)->len = p - buf; diff --git a/sample/test.rb b/sample/test.rb index d20f204da0..7194e072b1 100644 --- a/sample/test.rb +++ b/sample/test.rb @@ -1671,6 +1671,19 @@ test_ok(File.dirname("a/b/c") == "a/b") test_ok(File.dirname("/a/b/c") == "/a/b") test_ok(File.dirname("/a/b/") == "/a") test_ok(File.dirname("/a/b///") == "/a") +case Dir.pwd +when %r'\A\w:' + test_ok(/\A\w:\/\z/ =~ File.expand_path(".", "/")) + test_ok(/\A\w:\/a\z/ =~ File.expand_path("a", "/")) +when %r'\A//' + test_ok(%r'\A//[^/]+/[^/]+\z' =~ File.expand_path(".", "/")) + test_ok(%r'\A//[^/]+/[^/]+/a\z' =~ File.expand_path(".", "/")) +else + test_ok(File.expand_path(".", "/") == "/") + test_ok(File.expand_path("sub", "/") == "/sub") +end +test_ok(File.expand_path(".", "//") == "//") +test_ok(File.expand_path("sub", "//") == "//sub") test_check "gc" begin -- cgit v1.2.3