From 968e1ce1e4343235de0f753d42130f3d64034a88 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 3 Apr 2024 13:33:18 -0700 Subject: [PATCH] os: convert poll.ErrFileClosed to ErrClosed for Stat Fixes #66665 Change-Id: I3e3b7433d245daa997d7d502c2ef8978af6664fb Reviewed-on: https://go-review.googlesource.com/c/go/+/576119 LUCI-TryBot-Result: Go LUCI Reviewed-by: Ian Lance Taylor Commit-Queue: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: Robert Griesemer --- src/os/stat_test.go | 24 ++++++++++++++++++++++++ src/os/stat_unix.go | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/os/stat_test.go b/src/os/stat_test.go index e79f6a90c6..36da573f0c 100644 --- a/src/os/stat_test.go +++ b/src/os/stat_test.go @@ -5,6 +5,7 @@ package os_test import ( + "errors" "internal/testenv" "io/fs" "os" @@ -337,3 +338,26 @@ func TestStatConsole(t *testing.T) { testStatAndLstat(t, `\\.\`+name, params) } } + +func TestClosedStat(t *testing.T) { + // Historically we do not seem to match ErrClosed on non-Unix systems. + switch runtime.GOOS { + case "windows", "plan9": + t.Skipf("skipping on %s", runtime.GOOS) + } + + t.Parallel() + f, err := os.Open("testdata/hello") + if err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } + _, err = f.Stat() + if err == nil { + t.Error("Stat succeeded on closed File") + } else if !errors.Is(err, os.ErrClosed) { + t.Errorf("error from Stat on closed file did not match ErrClosed: %q, type %T", err, err) + } +} diff --git a/src/os/stat_unix.go b/src/os/stat_unix.go index 486a16413e..9a1f21211c 100644 --- a/src/os/stat_unix.go +++ b/src/os/stat_unix.go @@ -19,7 +19,7 @@ func (f *File) Stat() (FileInfo, error) { var fs fileStat err := f.pfd.Fstat(&fs.sys) if err != nil { - return nil, &PathError{Op: "stat", Path: f.name, Err: err} + return nil, f.wrapErr("stat", err) } fillFileStatFromSys(&fs, f.name) return &fs, nil