1
0
mirror of https://github.com/golang/go synced 2024-11-17 00:04:40 -07:00

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
This commit is contained in:
Nont Thanonchai 2023-03-16 22:34:03 -07:00
parent 3360be4a11
commit 636b6c37c1
2 changed files with 21 additions and 1 deletions

View File

@ -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
}

View File

@ -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