Skip to content

Commit 4475ebf

Browse files
committed
fixup! feat: remove mutability from the WasiCtx Table
Signed-off-by: Harald Hoyer <harald@profian.com>
1 parent e1d697c commit 4475ebf

1 file changed

Lines changed: 23 additions & 11 deletions

File tree

crates/wasi-common/src/dir.rs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::file::{FdFlags, FileCaps, FileType, Filestat, OFlags, WasiFile};
22
use crate::{Error, ErrorExt, SystemTimeSpec};
33
use bitflags::bitflags;
44
use std::any::Any;
5+
use std::ops::Deref;
56
use std::path::PathBuf;
67
use std::sync::{Arc, RwLock};
78

@@ -121,37 +122,48 @@ impl DirEntry {
121122
}
122123
}
123124
pub fn capable_of_dir(&self, caps: DirCaps) -> Result<(), Error> {
124-
if self.caps.read().unwrap().dir_caps.contains(caps) {
125+
let fdstat = self.caps.read().unwrap();
126+
Self::locked_capable_of_dir(&fdstat, caps)
127+
}
128+
fn locked_capable_of_dir(
129+
fdstat: &impl Deref<Target = DirFdStat>,
130+
caps: DirCaps,
131+
) -> Result<(), Error> {
132+
let fdstat = fdstat.deref();
133+
if fdstat.dir_caps.contains(caps) {
125134
Ok(())
126135
} else {
127-
let missing = caps & !self.caps.read().unwrap().dir_caps;
136+
let missing = caps & !fdstat.dir_caps;
128137
let err = if missing.intersects(DirCaps::READDIR) {
129138
Error::not_dir()
130139
} else {
131140
Error::perm()
132141
};
133142
Err(err.context(format!(
134143
"desired rights {:?}, has {:?}",
135-
caps,
136-
self.caps.read().unwrap().dir_caps
144+
caps, fdstat.dir_caps
137145
)))
138146
}
139147
}
140-
pub fn capable_of_file(&self, caps: FileCaps) -> Result<(), Error> {
141-
if self.caps.read().unwrap().file_caps.contains(caps) {
148+
fn locked_capable_of_file(
149+
fdstat: &impl Deref<Target = DirFdStat>,
150+
caps: FileCaps,
151+
) -> Result<(), Error> {
152+
let fdstat = fdstat.deref();
153+
if fdstat.file_caps.contains(caps) {
142154
Ok(())
143155
} else {
144156
Err(Error::perm().context(format!(
145157
"desired rights {:?}, has {:?}",
146-
caps,
147-
self.caps.read().unwrap().file_caps
158+
caps, fdstat.file_caps
148159
)))
149160
}
150161
}
151162
pub fn drop_caps_to(&self, dir_caps: DirCaps, file_caps: FileCaps) -> Result<(), Error> {
152-
self.capable_of_dir(dir_caps)?;
153-
self.capable_of_file(file_caps)?;
154-
*self.caps.write().unwrap() = DirFdStat {
163+
let mut fdstat = self.caps.write().unwrap();
164+
Self::locked_capable_of_dir(&fdstat, dir_caps)?;
165+
Self::locked_capable_of_file(&fdstat, file_caps)?;
166+
*fdstat = DirFdStat {
155167
dir_caps,
156168
file_caps,
157169
};

0 commit comments

Comments
 (0)