diff options
author | Ian Lance Taylor <iant@golang.org> | 2018-09-13 12:18:09 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2018-09-13 21:34:56 +0000 |
commit | 9f59918cae5eb23fdf0135b77280907365b52069 (patch) | |
tree | 5325401e234cd2cc728b1c5b221b7732bf502840 /src/path | |
parent | 7c95703c090757c4ca3f0792357e1595b03d6bca (diff) | |
download | go-9f59918cae5eb23fdf0135b77280907365b52069.tar.gz go-9f59918cae5eb23fdf0135b77280907365b52069.zip |
path/filepath: correct symlink eval for symlink at root
For a relative symlink in the root directory, such as /tmp ->
private/tmp, we were dropping the leading slash.
No test because we can't create a symlink in the root directory.
The test TestGZIPFilesHaveZeroMTimes was failing on the Darwin builders.
Updates #19922
Updates #20506
Change-Id: Ic83cb6d97ad0cb628fc551ac772a44fb3e20f038
Reviewed-on: https://go-review.googlesource.com/135295
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/path')
-rw-r--r-- | src/path/filepath/symlink.go | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/path/filepath/symlink.go b/src/path/filepath/symlink.go index 57dcbf314d..98a92357be 100644 --- a/src/path/filepath/symlink.go +++ b/src/path/filepath/symlink.go @@ -41,14 +41,15 @@ func walkSymlinks(path string) (string, error) { continue } else if path[start:end] == ".." { // Back up to previous component if possible. + // Note that volLen includes any leading slash. var r int - for r = len(dest) - 1; r >= 0; r-- { + for r = len(dest) - 1; r >= volLen; r-- { if os.IsPathSeparator(dest[r]) { break } } - if r < 0 { - if len(dest) > 0 { + if r < volLen { + if len(dest) > volLen { dest += string(os.PathSeparator) } dest += ".." @@ -117,12 +118,12 @@ func walkSymlinks(path string) (string, error) { // Symlink to relative path; replace last // path component in dest. var r int - for r = len(dest) - 1; r >= 0; r-- { + for r = len(dest) - 1; r >= volLen; r-- { if os.IsPathSeparator(dest[r]) { break } } - if r < 0 { + if r < volLen { dest = vol } else { dest = dest[:r] |