@@ -2,6 +2,7 @@ use crate::file::{FdFlags, FileCaps, FileType, Filestat, OFlags, WasiFile};
22use crate :: { Error , ErrorExt , SystemTimeSpec } ;
33use bitflags:: bitflags;
44use std:: any:: Any ;
5+ use std:: ops:: Deref ;
56use std:: path:: PathBuf ;
67use 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