os/kernel/syscall/
cred.rs1use crate::kernel::task::current_task;
6use crate::uapi::cred::{GID_UNCHANGED, ROOT_GID, ROOT_UID, UID_UNCHANGED};
7use crate::uapi::errno::{EFAULT, EPERM};
8use crate::util::user_buffer::{validate_user_ptr_mut, write_to_user};
9
10pub fn getuid() -> isize {
14 let task = current_task();
15 let task_inner = task.lock();
16 task_inner.credential.uid as isize
17}
18
19pub fn geteuid() -> isize {
23 let task = current_task();
24 let task_inner = task.lock();
25 task_inner.credential.euid as isize
26}
27
28pub fn getgid() -> isize {
32 let task = current_task();
33 let task_inner = task.lock();
34 task_inner.credential.gid as isize
35}
36
37pub fn getegid() -> isize {
41 let task = current_task();
42 let task_inner = task.lock();
43 task_inner.credential.egid as isize
44}
45
46pub fn setuid(uid: u32) -> isize {
50 if uid == ROOT_UID {
51 0
53 } else {
54 -EPERM as isize
56 }
57}
58
59pub fn setgid(gid: u32) -> isize {
63 if gid == ROOT_GID { 0 } else { -EPERM as isize }
64}
65
66pub fn seteuid(euid: u32) -> isize {
68 if euid == ROOT_UID { 0 } else { -EPERM as isize }
69}
70
71pub fn setegid(egid: u32) -> isize {
73 if egid == ROOT_GID { 0 } else { -EPERM as isize }
74}
75
76pub fn setresuid(ruid: u32, euid: u32, suid: u32) -> isize {
88 if (ruid != ROOT_UID && ruid != UID_UNCHANGED)
90 || (euid != ROOT_UID && euid != UID_UNCHANGED)
91 || (suid != ROOT_UID && suid != UID_UNCHANGED)
92 {
93 return -EPERM as isize;
94 }
95
96 0
98}
99
100pub fn setresgid(rgid: u32, egid: u32, sgid: u32) -> isize {
112 if (rgid != ROOT_GID && rgid != GID_UNCHANGED)
114 || (egid != ROOT_GID && egid != GID_UNCHANGED)
115 || (sgid != ROOT_GID && sgid != GID_UNCHANGED)
116 {
117 return -EPERM as isize;
118 }
119
120 0
122}
123
124pub fn getresuid(ruid: *mut u32, euid: *mut u32, suid: *mut u32) -> isize {
139 if !ruid.is_null() && !validate_user_ptr_mut(ruid) {
141 return -(EFAULT as isize);
142 }
143 if !euid.is_null() && !validate_user_ptr_mut(euid) {
144 return -(EFAULT as isize);
145 }
146 if !suid.is_null() && !validate_user_ptr_mut(suid) {
147 return -(EFAULT as isize);
148 }
149
150 let task = current_task();
151 let task_inner = task.lock();
152 let cred = &task_inner.credential;
153
154 unsafe {
156 if !ruid.is_null() {
157 write_to_user(ruid, cred.uid);
158 }
159 if !euid.is_null() {
160 write_to_user(euid, cred.euid);
161 }
162 if !suid.is_null() {
163 write_to_user(suid, cred.suid);
164 }
165 }
166 0
167}
168
169pub fn getresgid(rgid: *mut u32, egid: *mut u32, sgid: *mut u32) -> isize {
184 if !rgid.is_null() && !validate_user_ptr_mut(rgid) {
186 return -(EFAULT as isize);
187 }
188 if !egid.is_null() && !validate_user_ptr_mut(egid) {
189 return -(EFAULT as isize);
190 }
191 if !sgid.is_null() && !validate_user_ptr_mut(sgid) {
192 return -(EFAULT as isize);
193 }
194
195 let task = current_task();
196 let task_inner = task.lock();
197 let cred = &task_inner.credential;
198
199 unsafe {
201 if !rgid.is_null() {
202 write_to_user(rgid, cred.gid);
203 }
204 if !egid.is_null() {
205 write_to_user(egid, cred.egid);
206 }
207 if !sgid.is_null() {
208 write_to_user(sgid, cred.sgid);
209 }
210 }
211 0
212}
213
214pub fn umask(mask: u32) -> isize {
225 let task = current_task();
226 let mut task_inner = task.lock();
227 let old_umask = task_inner.umask;
228 task_inner.umask = mask & 0o777; old_umask as isize
230}