diff options
author | Yasuhiro Matsumoto <mattn.jp@gmail.com> | 2018-08-20 10:15:47 +0900 |
---|---|---|
committer | Alex Brainman <alex.brainman@gmail.com> | 2018-08-26 04:23:19 +0000 |
commit | b7d3e14a5296b17c940983aed0d9d6cb54b912b7 (patch) | |
tree | 55fd7ce26d19d791651081f62766dad99dd7077f /src/path | |
parent | c21ba224ec88c2a5cb01dad54f06819ed29d4ba4 (diff) | |
download | go-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.go | 4 | ||||
-rw-r--r-- | src/path/filepath/path_windows.go | 9 |
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 |