2020use aero_syscall:: prelude:: FdFlags ;
2121use aero_syscall:: { AeroSyscallError , OpenFlags } ;
2222
23+ use crate :: arch:: controlregs;
24+
2325use crate :: fs:: inode:: DirEntry ;
2426use crate :: fs:: pipe:: Pipe ;
2527use crate :: fs:: { self , lookup_path, LookupMode } ;
@@ -39,8 +41,8 @@ pub fn write(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSyscall
3941 . flags
4042 . intersects ( OpenFlags :: O_WRONLY | OpenFlags :: O_RDWR )
4143 {
42- let buffer = validate_slice ( buffer as * const u8 , size) . ok_or ( AeroSyscallError :: EINVAL ) ?;
43- Ok ( handle. write ( buffer) ?)
44+ let buffer = controlregs :: with_userspace_access ( || validate_slice ( buffer as * const u8 , size) . ok_or ( AeroSyscallError :: EINVAL ) ) ?;
45+ Ok ( controlregs :: with_userspace_access ( || handle. write ( buffer) ) ?)
4446 } else {
4547 Err ( AeroSyscallError :: EACCES )
4648 }
@@ -57,8 +59,8 @@ pub fn read(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSyscallE
5759 . flags
5860 . intersects ( OpenFlags :: O_RDONLY | OpenFlags :: O_RDWR )
5961 {
60- let buffer = validate_slice_mut ( buffer as * mut u8 , size) . ok_or ( AeroSyscallError :: EINVAL ) ?;
61- Ok ( handle. read ( buffer) ?)
62+ let buffer = controlregs :: with_userspace_access ( || validate_slice_mut ( buffer as * mut u8 , size) . ok_or ( AeroSyscallError :: EINVAL ) ) ?;
63+ Ok ( controlregs :: with_userspace_access ( || handle. read ( buffer) ) ?)
6264 } else {
6365 Err ( AeroSyscallError :: EACCES )
6466 }
@@ -71,7 +73,7 @@ pub fn open(_fd: usize, path: usize, len: usize, mode: usize) -> Result<usize, A
7173 flags. insert ( OpenFlags :: O_RDONLY ) ;
7274 }
7375
74- let path = validate_str ( path as * const u8 , len) . ok_or ( AeroSyscallError :: EINVAL ) ?;
76+ let path = controlregs :: with_userspace_access ( || validate_str ( path as * const u8 , len) . ok_or ( AeroSyscallError :: EINVAL ) ) ?;
7577 let path = Path :: new ( path) ;
7678
7779 let mut lookup_mode = LookupMode :: None ;
@@ -80,7 +82,7 @@ pub fn open(_fd: usize, path: usize, len: usize, mode: usize) -> Result<usize, A
8082 lookup_mode = LookupMode :: Create ;
8183 }
8284
83- let inode = fs:: lookup_path_with_mode ( path, lookup_mode) ?;
85+ let inode = controlregs :: with_userspace_access ( || fs:: lookup_path_with_mode ( path, lookup_mode) ) ?;
8486
8587 if flags. contains ( OpenFlags :: O_DIRECTORY ) && !inode. inode ( ) . metadata ( ) ?. is_directory ( ) {
8688 return Err ( AeroSyscallError :: ENOTDIR ) ;
@@ -118,7 +120,7 @@ pub fn getdents(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSysc
118120 . ok_or ( AeroSyscallError :: EBADFD ) ?;
119121
120122 let buffer = validate_slice_mut ( buffer as * mut u8 , size) . ok_or ( AeroSyscallError :: EINVAL ) ?;
121- Ok ( handle. get_dents ( buffer) ?)
123+ Ok ( controlregs :: with_userspace_access ( || handle. get_dents ( buffer) ) ?)
122124}
123125
124126pub fn close ( fd : usize ) -> Result < usize , AeroSyscallError > {
@@ -224,7 +226,7 @@ pub fn getcwd(buffer: usize, size: usize) -> Result<usize, AeroSyscallError> {
224226 let buffer = validate_slice_mut ( buffer as * mut u8 , size) . ok_or ( AeroSyscallError :: EINVAL ) ?;
225227 let cwd = scheduler:: get_scheduler ( ) . current_task ( ) . get_cwd ( ) ;
226228
227- buffer[ ..cwd. len ( ) ] . copy_from_slice ( cwd. as_bytes ( ) ) ;
229+ controlregs :: with_userspace_access ( || buffer[ ..cwd. len ( ) ] . copy_from_slice ( cwd. as_bytes ( ) ) ) ;
228230 Ok ( cwd. len ( ) )
229231}
230232
0 commit comments