diff --git a/crates/wasi-common/cap-std-sync/src/dir.rs b/crates/wasi-common/cap-std-sync/src/dir.rs index 728a65be6b..113eb8e3bf 100644 --- a/crates/wasi-common/cap-std-sync/src/dir.rs +++ b/crates/wasi-common/cap-std-sync/src/dir.rs @@ -5,7 +5,7 @@ use std::convert::TryInto; use std::path::{Path, PathBuf}; use wasi_common::{ dir::{ReaddirCursor, ReaddirEntity, WasiDir}, - file::{FdFlags, FileCaps, FileType, Filestat, OFlags, WasiFile}, + file::{FdFlags, FileType, Filestat, OFlags, WasiFile}, Error, ErrorExt, }; @@ -26,7 +26,8 @@ impl WasiDir for Dir { symlink_follow: bool, path: &str, oflags: OFlags, - caps: FileCaps, + read: bool, + write: bool, fdflags: FdFlags, ) -> Result, Error> { use cap_fs_ext::{FollowSymlinks, OpenOptionsFollowExt}; @@ -43,11 +44,10 @@ impl WasiDir for Dir { if oflags.contains(OFlags::TRUNCATE) { opts.truncate(true); } - if caps.contains(FileCaps::WRITE) - || caps.contains(FileCaps::DATASYNC) - || caps.contains(FileCaps::ALLOCATE) - || caps.contains(FileCaps::FILESTAT_SET_SIZE) - { + if read { + opts.read(true); + } + if write { opts.write(true); } else { // If not opened write, open read. This way the OS lets us open the file. @@ -55,9 +55,6 @@ impl WasiDir for Dir { // get_cap check. opts.read(true); } - if caps.contains(FileCaps::READ) { - opts.read(true); - } if fdflags.contains(FdFlags::APPEND) { opts.append(true); } diff --git a/crates/wasi-common/src/dir.rs b/crates/wasi-common/src/dir.rs index 2f3ab442ff..9c9ff80d95 100644 --- a/crates/wasi-common/src/dir.rs +++ b/crates/wasi-common/src/dir.rs @@ -13,7 +13,8 @@ pub trait WasiDir { symlink_follow: bool, path: &str, oflags: OFlags, - caps: FileCaps, + read: bool, + write: bool, fdflags: FdFlags, ) -> Result, Error>; fn open_dir(&self, symlink_follow: bool, path: &str) -> Result, Error>; diff --git a/crates/wasi-common/src/snapshots/preview_1.rs b/crates/wasi-common/src/snapshots/preview_1.rs index 0f00ab371e..c04967639b 100644 --- a/crates/wasi-common/src/snapshots/preview_1.rs +++ b/crates/wasi-common/src/snapshots/preview_1.rs @@ -813,7 +813,11 @@ impl<'a> wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx { let file_caps = dir_entry.child_file_caps(FileCaps::from(&fs_rights_base)); let dir = dir_entry.get_cap(required_caps)?; - let file = dir.open_file(symlink_follow, path.deref(), oflags, file_caps, fdflags)?; + let read = file_caps.contains(FileCaps::READ); + let write = file_caps.contains(FileCaps::WRITE) + || file_caps.contains(FileCaps::ALLOCATE) + || file_caps.contains(FileCaps::FILESTAT_SET_SIZE); + let file = dir.open_file(symlink_follow, path.deref(), oflags, read, write, fdflags)?; drop(dir); let fd = table.push(Box::new(FileEntry::new(file_caps, file)))?; Ok(types::Fd::from(fd))