Skip to content

Commit ed543ae

Browse files
authored
Rollup merge of #75189 - kawamuray:bugfix-wasi-append, r=KodrAus
Fix wasi::fs::OpenOptions to imply write when append is on This PR fixes a bug in `OpenOptions` of `wasi` platform that it currently doesn't imply write mode when only `append` is enabled. As explained in the [doc of OpenOptions#append](https://doc.rust-lang.org/std/fs/struct.OpenOptions.html#method.append), calling `.append(true)` should imply `.write(true)` as well. ## Reproduce Given below simple Rust program: ```rust use std::fs::OpenOptions; use std::io::Write; fn main() { let mut file = OpenOptions::new() .write(true) .create(true) .open("foo.txt") .unwrap(); writeln!(file, "abc").unwrap(); } ``` it can successfully compiled into wasm and execute by `wasmtime` runtime: ```sh $ rustc --target wasm32-wasi write.rs $ ~/wasmtime/target/debug/wasmtime run --dir=. write.wasm $ cat foo.txt abc ``` However when I change `.write(true)` to `.append(true)`, it fails to execute by the error "Capabilities insufficient": ```sh $ ~/wasmtime/target/debug/wasmtime run --dir=. append.wasm thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 76, kind: Other, message: "Capabilities insufficient" }', append.rs:10:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace Error: failed to run main module `append.wasm` ... ``` This is because of lacking "rights" on the opened file: ```sh $ RUST_LOG=trace ~/wasmtime/target/debug/wasmtime run --dir=. append.wasm 2>&1 | grep validate_rights TRACE wasi_common::entry > | validate_rights failed: required rights = HandleRights { base: fd_write (0x40), inheriting: empty (0x0) }; actual rights = HandleRights { base: fd_seek|fd_fdstat_set_flags|fd_sync|fd_tell|fd_advise|fd_filestat_set_times|poll_fd_readwrite (0x88000bc), inheriting: empty (0x0) } ```
2 parents 847ba83 + 165a6e5 commit ed543ae

File tree

1 file changed

+5
-3
lines changed
  • library/std/src/sys/wasi

1 file changed

+5
-3
lines changed

library/std/src/sys/wasi/fs.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ pub struct DirEntry {
4646
pub struct OpenOptions {
4747
read: bool,
4848
write: bool,
49+
append: bool,
4950
dirflags: wasi::Lookupflags,
5051
fdflags: wasi::Fdflags,
5152
oflags: wasi::Oflags,
@@ -270,8 +271,9 @@ impl OpenOptions {
270271
}
271272
}
272273

273-
pub fn append(&mut self, set: bool) {
274-
self.fdflag(wasi::FDFLAGS_APPEND, set);
274+
pub fn append(&mut self, append: bool) {
275+
self.append = append;
276+
self.fdflag(wasi::FDFLAGS_APPEND, append);
275277
}
276278

277279
pub fn dsync(&mut self, set: bool) {
@@ -321,7 +323,7 @@ impl OpenOptions {
321323
base |= wasi::RIGHTS_FD_READ;
322324
base |= wasi::RIGHTS_FD_READDIR;
323325
}
324-
if self.write {
326+
if self.write || self.append {
325327
base |= wasi::RIGHTS_FD_WRITE;
326328
base |= wasi::RIGHTS_FD_DATASYNC;
327329
base |= wasi::RIGHTS_FD_ALLOCATE;

0 commit comments

Comments
 (0)