Commit 5cc80899 authored by Alex Brainman's avatar Alex Brainman

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: 's avatarIan Lance Taylor <iant@golang.org>
parent fde4b9ed
......@@ -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))
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment