From: Hiroshi Ioka Date: Tue, 11 Apr 2017 00:54:08 +0000 (+0900) Subject: os: adjust error in Stat on windows X-Git-Tag: go1.9beta1~753 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5a8eae6d47d768a8900ddf7a6a4d20db53ae519d;p=gostls13.git os: adjust error in Stat on windows Current code could return a non-nil os.FileInfo even if there is an error. This is a bit incompatible with Stat on other OSes. Change-Id: I37b608da234f957bb89b82509649de78ccc70bbb Reviewed-on: https://go-review.googlesource.com/40330 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- diff --git a/src/os/os_test.go b/src/os/os_test.go index fcfcc43620..410bfc8007 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -174,6 +174,45 @@ func TestStat(t *testing.T) { } } +func TestStatError(t *testing.T) { + defer chtmpdir(t)() + + path := "no-such-file" + Remove(path) // Just in case + + fi, err := Stat(path) + if err == nil { + t.Fatal("got nil, want error") + } + if fi != nil { + t.Errorf("got %v, want nil", fi) + } + if perr, ok := err.(*PathError); !ok { + t.Errorf("got %T, want %T", err, perr) + } + + testenv.MustHaveSymlink(t) + + link := "symlink" + Remove(link) // Just in case + err = Symlink(path, link) + if err != nil { + t.Fatal(err) + } + defer Remove(link) + + fi, err = Stat(link) + if err == nil { + t.Fatal("got nil, want error") + } + if fi != nil { + t.Errorf("got %v, want nil", fi) + } + if perr, ok := err.(*PathError); !ok { + t.Errorf("got %T, want %T", err, perr) + } +} + func TestFstat(t *testing.T) { path := sfdir + "/" + sfname file, err1 := Open(path) diff --git a/src/os/stat_windows.go b/src/os/stat_windows.go index fe0ca8d1b2..3c640ce992 100644 --- a/src/os/stat_windows.go +++ b/src/os/stat_windows.go @@ -66,14 +66,14 @@ func Stat(name string) (FileInfo, error) { for i := 0; i < 255; i++ { fi, err = Lstat(name) if err != nil { - return fi, err + return nil, err } if fi.Mode()&ModeSymlink == 0 { return fi, nil } newname, err := Readlink(name) if err != nil { - return fi, err + return nil, err } if isAbs(newname) { name = newname