os: use Stat instead of Lstat in Symlink

Windows implementation of Symlink uses CreateSymbolicLink Windows
API. The API requires to identify the target type: file or
directory. Current Symlink implementation  uses Lstat to determine
symlink type, but Lstat will not be able to determine correct
result if destination is symlink. Replace Lstat call with Stat.

Fixes #28432

Change-Id: Ibee6d8ac21e2246bf8d0a019c4c66d38b09887d4
Reviewed-on: https://go-review.googlesource.com/c/145217
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Alex Brainman 2018-10-26 18:44:17 +11:00
parent fde4b9ed14
commit 5cc8089948
2 changed files with 17 additions and 1 deletions

View File

@ -362,7 +362,7 @@ func Symlink(oldname, newname string) error {
destpath = dirname(newname) + `\` + oldname
}
fi, err := Lstat(destpath)
fi, err := Stat(destpath)
isdir := err == nil && fi.IsDir()
n, err := syscall.UTF16PtrFromString(fixLongPath(newname))

View File

@ -205,6 +205,14 @@ func TestDirAndSymlinkStats(t *testing.T) {
}
testSymlinkStats(t, dirlink, true)
testSymlinkSameFile(t, dir, dirlink)
linklink := filepath.Join(tmpdir, "linklink")
err = os.Symlink(dirlink, linklink)
if err != nil {
t.Fatal(err)
}
testSymlinkStats(t, linklink, true)
testSymlinkSameFile(t, dir, linklink)
}
func TestFileAndSymlinkStats(t *testing.T) {
@ -230,6 +238,14 @@ func TestFileAndSymlinkStats(t *testing.T) {
}
testSymlinkStats(t, filelink, false)
testSymlinkSameFile(t, file, filelink)
linklink := filepath.Join(tmpdir, "linklink")
err = os.Symlink(filelink, linklink)
if err != nil {
t.Fatal(err)
}
testSymlinkStats(t, linklink, false)
testSymlinkSameFile(t, file, linklink)
}
// see issue 27225 for details