aboutsummaryrefslogtreecommitdiff
path: root/src/path
diff options
context:
space:
mode:
authorYasuhiro Matsumoto <mattn.jp@gmail.com>2018-08-20 10:15:47 +0900
committerAlex Brainman <alex.brainman@gmail.com>2018-08-26 04:23:19 +0000
commitb7d3e14a5296b17c940983aed0d9d6cb54b912b7 (patch)
tree55fd7ce26d19d791651081f62766dad99dd7077f /src/path
parentc21ba224ec88c2a5cb01dad54f06819ed29d4ba4 (diff)
downloadgo-b7d3e14a5296b17c940983aed0d9d6cb54b912b7.tar.gz
go-b7d3e14a5296b17c940983aed0d9d6cb54b912b7.zip
path/filepath: fix Join with Windows drive letter
Join("C:", "", "b") must return relative path "C:b" Fixes #26953 Change-Id: I2f843ce3f9f18a1ce0e2d0f3a15233f237992776 Reviewed-on: https://go-review.googlesource.com/129758 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Diffstat (limited to 'src/path')
-rw-r--r--src/path/filepath/path_test.go4
-rw-r--r--src/path/filepath/path_windows.go9
2 files changed, 12 insertions, 1 deletions
diff --git a/src/path/filepath/path_test.go b/src/path/filepath/path_test.go
index dde087253d..e50ee97bcb 100644
--- a/src/path/filepath/path_test.go
+++ b/src/path/filepath/path_test.go
@@ -271,6 +271,10 @@ var winjointests = []JoinTest{
{[]string{`C:`, `a`}, `C:a`},
{[]string{`C:`, `a\b`}, `C:a\b`},
{[]string{`C:`, `a`, `b`}, `C:a\b`},
+ {[]string{`C:`, ``, `b`}, `C:b`},
+ {[]string{`C:`, ``, ``, `b`}, `C:b`},
+ {[]string{`C:`, ``}, `C:.`},
+ {[]string{`C:`, ``, ``}, `C:.`},
{[]string{`C:.`, `a`}, `C:a`},
{[]string{`C:a`, `b`}, `C:a\b`},
{[]string{`C:a`, `b`, `d`}, `C:a\b\d`},
diff --git a/src/path/filepath/path_windows.go b/src/path/filepath/path_windows.go
index 409e8d6466..519b6ebc32 100644
--- a/src/path/filepath/path_windows.go
+++ b/src/path/filepath/path_windows.go
@@ -134,7 +134,14 @@ func joinNonEmpty(elem []string) string {
if len(elem[0]) == 2 && elem[0][1] == ':' {
// First element is drive letter without terminating slash.
// Keep path relative to current directory on that drive.
- return Clean(elem[0] + strings.Join(elem[1:], string(Separator)))
+ // Skip empty elements.
+ i := 1
+ for ; i < len(elem); i++ {
+ if elem[i] != "" {
+ break
+ }
+ }
+ return Clean(elem[0] + strings.Join(elem[i:], string(Separator)))
}
// The following logic prevents Join from inadvertently creating a
// UNC path on Windows. Unless the first element is a UNC path, Join