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
 		}
 	}