20
20
use aero_syscall:: prelude:: FdFlags ;
21
21
use aero_syscall:: { AeroSyscallError , OpenFlags } ;
22
22
23
+ use crate :: arch:: controlregs;
24
+
23
25
use crate :: fs:: inode:: DirEntry ;
24
26
use crate :: fs:: pipe:: Pipe ;
25
27
use crate :: fs:: { self , lookup_path, LookupMode } ;
@@ -39,8 +41,8 @@ pub fn write(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSyscall
39
41
. flags
40
42
. intersects ( OpenFlags :: O_WRONLY | OpenFlags :: O_RDWR )
41
43
{
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) ) ?)
44
46
} else {
45
47
Err ( AeroSyscallError :: EACCES )
46
48
}
@@ -57,8 +59,8 @@ pub fn read(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSyscallE
57
59
. flags
58
60
. intersects ( OpenFlags :: O_RDONLY | OpenFlags :: O_RDWR )
59
61
{
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) ) ?)
62
64
} else {
63
65
Err ( AeroSyscallError :: EACCES )
64
66
}
@@ -71,7 +73,7 @@ pub fn open(_fd: usize, path: usize, len: usize, mode: usize) -> Result<usize, A
71
73
flags. insert ( OpenFlags :: O_RDONLY ) ;
72
74
}
73
75
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 ) ) ?;
75
77
let path = Path :: new ( path) ;
76
78
77
79
let mut lookup_mode = LookupMode :: None ;
@@ -80,7 +82,7 @@ pub fn open(_fd: usize, path: usize, len: usize, mode: usize) -> Result<usize, A
80
82
lookup_mode = LookupMode :: Create ;
81
83
}
82
84
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) ) ?;
84
86
85
87
if flags. contains ( OpenFlags :: O_DIRECTORY ) && !inode. inode ( ) . metadata ( ) ?. is_directory ( ) {
86
88
return Err ( AeroSyscallError :: ENOTDIR ) ;
@@ -118,7 +120,7 @@ pub fn getdents(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSysc
118
120
. ok_or ( AeroSyscallError :: EBADFD ) ?;
119
121
120
122
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) ) ?)
122
124
}
123
125
124
126
pub fn close ( fd : usize ) -> Result < usize , AeroSyscallError > {
@@ -224,7 +226,7 @@ pub fn getcwd(buffer: usize, size: usize) -> Result<usize, AeroSyscallError> {
224
226
let buffer = validate_slice_mut ( buffer as * mut u8 , size) . ok_or ( AeroSyscallError :: EINVAL ) ?;
225
227
let cwd = scheduler:: get_scheduler ( ) . current_task ( ) . get_cwd ( ) ;
226
228
227
- buffer[ ..cwd. len ( ) ] . copy_from_slice ( cwd. as_bytes ( ) ) ;
229
+ controlregs :: with_userspace_access ( || buffer[ ..cwd. len ( ) ] . copy_from_slice ( cwd. as_bytes ( ) ) ) ;
228
230
Ok ( cwd. len ( ) )
229
231
}
230
232
0 commit comments