mirror of https://github.com/golang/go.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: 636b6c37c1
GitHub-Pull-Request: golang/go#59085
Reviewed-on: https://go-review.googlesource.com/c/go/+/477215
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Quim Muntal <quimmuntal@gmail.com>
Run-TryBot: Quim Muntal <quimmuntal@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
This commit is contained in:
parent
bcd82125f8
commit
ed2442a0e1
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue