aboutsummaryrefslogtreecommitdiff
path: root/src/path
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2018-09-13 12:18:09 -0700
committerIan Lance Taylor <iant@golang.org>2018-09-13 21:34:56 +0000
commit9f59918cae5eb23fdf0135b77280907365b52069 (patch)
tree5325401e234cd2cc728b1c5b221b7732bf502840 /src/path
parent7c95703c090757c4ca3f0792357e1595b03d6bca (diff)
downloadgo-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.go11
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]