Fix fd_fdstat_set_flags truncating with O_TRUNC (#1863)

This commit is contained in:
Yage Hu
2023-12-12 06:49:56 -08:00
committed by GitHub
parent 5796897f37
commit 99ededcefd
2 changed files with 38 additions and 2 deletions

View File

@@ -480,6 +480,42 @@ func Test_fdFdstatGet_StdioNonblock(t *testing.T) {
}
}
func Test_fdFdstatSetFlagsWithTrunc(t *testing.T) {
tmpDir := t.TempDir()
fileName := "test"
mod, r, log := requireProxyModule(t, wazero.NewModuleConfig().
WithFSConfig(wazero.NewFSConfig().WithDirMount(tmpDir, "/")))
defer r.Close(testCtx)
fsc := mod.(*wasm.ModuleInstance).Sys.FS()
preopen := fsc.RootFS()
fd, errno := fsc.OpenFile(preopen, fileName, experimentalsys.O_RDWR|experimentalsys.O_CREAT|experimentalsys.O_EXCL|experimentalsys.O_TRUNC, 0o600)
require.EqualErrno(t, 0, errno)
// Write the initial text to the file.
f, ok := fsc.LookupFile(fd)
require.True(t, ok)
n, _ := f.File.Write([]byte("abc"))
require.Equal(t, n, 3)
buf, err := os.ReadFile(joinPath(tmpDir, fileName))
require.NoError(t, err)
require.Equal(t, "abc", string(buf))
requireErrnoResult(t, wasip1.ErrnoSuccess, mod, wasip1.FdFdstatSetFlagsName, uint64(fd), uint64(0))
require.Equal(t, `
==> wasi_snapshot_preview1.fd_fdstat_set_flags(fd=4,flags=)
<== errno=ESUCCESS
`, "\n"+log.String())
log.Reset()
buf, err = os.ReadFile(joinPath(tmpDir, fileName))
require.NoError(t, err)
require.Equal(t, "abc", string(buf))
}
func Test_fdFdstatSetFlags(t *testing.T) {
tmpDir := t.TempDir() // open before loop to ensure no locking problems.

View File

@@ -83,8 +83,8 @@ func (f *osFile) SetAppend(enable bool) (errno experimentalsys.Errno) {
f.flag &= ^experimentalsys.O_APPEND
}
// Clear any create flag, as we are re-opening, not re-creating.
f.flag &= ^experimentalsys.O_CREAT
// Clear any create or trunc flag, as we are re-opening, not re-creating.
f.flag &= ^(experimentalsys.O_CREAT | experimentalsys.O_TRUNC)
// appendMode (bool) cannot be changed later, so we have to re-open the
// file. https://github.com/golang/go/blob/go1.20/src/os/file_unix.go#L60