The Windows version of Stat calls Readlink iteratively until
reaching a non-symlink file.
If the given file is a circular symlink, It never stops.
This CL defines the maximum number of symlink loop count.
If the loop count will exceed that number, Stat will return error.
Fixes #16538
Change-Id: Ia9f3f2259a8d32801461c5041cc24a34f9f81009
Reviewed-on: https://go-review.googlesource.com/27580
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
close(hold) // let workers race to remove root
wg.Wait()
}
+
+func TestStatSymlinkLoop(t *testing.T) {
+ testenv.MustHaveSymlink(t)
+
+ defer chtmpdir(t)()
+
+ err := Symlink("x", "y")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer Remove("y")
+
+ err = Symlink("y", "x")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer Remove("x")
+
+ _, err = Stat("x")
+ if perr, ok := err.(*PathError); !ok || perr.Err != syscall.ELOOP {
+ t.Errorf("expected *PathError with ELOOP, got %T: %v\n", err, err)
+ }
+}
func Stat(name string) (FileInfo, error) {
var fi FileInfo
var err error
- for {
+ for i := 0; i < 255; i++ {
fi, err = Lstat(name)
if err != nil {
return fi, err
return fi, err
}
}
+ return nil, &PathError{"Stat", name, syscall.ELOOP}
}
// Lstat returns the FileInfo structure describing the named file.