os: handle relative symlinks starting with slash in Stat on windows
https://go-review.googlesource.com/c/39932/ handles relative symlinks.
But that change is incomplete.
We also have to handle relative symlinks starting with slash too.
Fixes #19937
Change-Id: I50dbccbaf270cb48a08fa57e5f450e5da18a7701
Reviewed-on: https://go-review.googlesource.com/40410
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/os/os_test.go b/src/os/os_test.go
index 410bfc8..a7fbfa4 100644
--- a/src/os/os_test.go
+++ b/src/os/os_test.go
@@ -1813,6 +1813,23 @@
if !SameFile(st, st1) {
t.Error("Stat doesn't follow relative symlink")
}
+
+ if runtime.GOOS == "windows" {
+ Remove(link)
+ err = Symlink(target[len(filepath.VolumeName(target)):], link)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ st1, err := Stat(link)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !SameFile(st, st1) {
+ t.Error("Stat doesn't follow relative symlink")
+ }
+ }
}
func TestReadAtEOF(t *testing.T) {
diff --git a/src/os/stat_windows.go b/src/os/stat_windows.go
index 3c640ce..bcce81c 100644
--- a/src/os/stat_windows.go
+++ b/src/os/stat_windows.go
@@ -75,9 +75,12 @@
if err != nil {
return nil, err
}
- if isAbs(newname) {
+ switch {
+ case isAbs(newname):
name = newname
- } else {
+ case len(newname) > 0 && IsPathSeparator(newname[0]):
+ name = volumeName(name) + newname
+ default:
name = dirname(name) + `\` + newname
}
}