From: Nont Thanonchai Date: Wed, 22 Mar 2023 01:04:45 +0000 (+0000) Subject: os: avoid creating a new file in Truncate on Windows X-Git-Tag: go1.21rc1~1194 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ed2442a0e1d1871f3210f26a1e3adb722ea2467d;p=gostls13.git os: avoid creating a new file in Truncate on Windows Truncate() a non existent file on Windows currently creates a new blank file. This behavior is not consistent with other OSes where a file not found error would instead be returned. This change makes Truncate on Windows return a file-not-found error when the specified file doesn't exist, bringing the behavior consistent. New test cases have been added to prevent a regression. Fixes #58977 Change-Id: Iaf7b41fc4ea86a2b2ccc59f8be81be42ed211b5c GitHub-Last-Rev: 636b6c37c1685096281ad506f3cfe35fd5810cb2 GitHub-Pull-Request: golang/go#59085 Reviewed-on: https://go-review.googlesource.com/c/go/+/477215 Reviewed-by: Ian Lance Taylor Reviewed-by: Quim Muntal Run-TryBot: Quim Muntal TryBot-Result: Gopher Robot Reviewed-by: Bryan Mills --- diff --git a/src/os/file_windows.go b/src/os/file_windows.go index e7ee3a5607..7e495069ef 100644 --- a/src/os/file_windows.go +++ b/src/os/file_windows.go @@ -160,7 +160,7 @@ func (f *File) seek(offset int64, whence int) (ret int64, err error) { // Truncate changes the size of the named file. // If the file is a symbolic link, it changes the size of the link's target. func Truncate(name string, size int64) error { - f, e := OpenFile(name, O_WRONLY|O_CREATE, 0666) + f, e := OpenFile(name, O_WRONLY, 0666) if e != nil { return e } diff --git a/src/os/os_test.go b/src/os/os_test.go index a8488a11f8..af6eb705b2 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -1335,6 +1335,26 @@ func TestTruncate(t *testing.T) { } } +func TestTruncateNonexistentFile(t *testing.T) { + t.Parallel() + + assertPathError := func(t testing.TB, path string, err error) { + t.Helper() + if pe, ok := err.(*os.PathError); !ok || !os.IsNotExist(err) || pe.Path != path { + t.Errorf("got error: %v\nwant an ErrNotExist PathError with path %q", err, path) + } + } + + path := filepath.Join(t.TempDir(), "nonexistent") + + err := os.Truncate(path, 1) + assertPathError(t, path, err) + + // Truncate shouldn't create any new file. + _, err = os.Stat(path) + assertPathError(t, path, err) +} + // Use TempDir (via newFile) to make sure we're on a local file system, // so that timings are not distorted by latency and caching. // On NFS, timings can be off due to caching of meta-data on