|
@@ -6,6 +6,7 @@ use system_error::SystemError;
|
|
|
|
|
|
use super::{
|
|
use super::{
|
|
abi::WaitOption,
|
|
abi::WaitOption,
|
|
|
|
+ cred::{Kgid, Kuid},
|
|
exit::kernel_wait4,
|
|
exit::kernel_wait4,
|
|
fork::{CloneFlags, KernelCloneArgs},
|
|
fork::{CloneFlags, KernelCloneArgs},
|
|
resource::{RLimit64, RLimitID, RUsage, RUsageWho},
|
|
resource::{RLimit64, RLimitID, RUsage, RUsageWho},
|
|
@@ -286,25 +287,125 @@ impl Syscall {
|
|
}
|
|
}
|
|
|
|
|
|
pub fn getuid() -> Result<usize, SystemError> {
|
|
pub fn getuid() -> Result<usize, SystemError> {
|
|
- // todo: 增加credit功能之后,需要修改
|
|
|
|
- return Ok(0);
|
|
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ return Ok(pcb.cred.lock().uid.data());
|
|
}
|
|
}
|
|
|
|
|
|
pub fn getgid() -> Result<usize, SystemError> {
|
|
pub fn getgid() -> Result<usize, SystemError> {
|
|
- // todo: 增加credit功能之后,需要修改
|
|
|
|
- return Ok(0);
|
|
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ return Ok(pcb.cred.lock().gid.data());
|
|
}
|
|
}
|
|
|
|
|
|
pub fn geteuid() -> Result<usize, SystemError> {
|
|
pub fn geteuid() -> Result<usize, SystemError> {
|
|
- // todo: 增加credit功能之后,需要修改
|
|
|
|
- return Ok(0);
|
|
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ return Ok(pcb.cred.lock().euid.data());
|
|
}
|
|
}
|
|
|
|
|
|
pub fn getegid() -> Result<usize, SystemError> {
|
|
pub fn getegid() -> Result<usize, SystemError> {
|
|
- // todo: 增加credit功能之后,需要修改
|
|
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ return Ok(pcb.cred.lock().egid.data());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pub fn setuid(uid: usize) -> Result<usize, SystemError> {
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ let mut guard = pcb.cred.lock();
|
|
|
|
+
|
|
|
|
+ if guard.uid.data() == 0 {
|
|
|
|
+ guard.setuid(uid);
|
|
|
|
+ guard.seteuid(uid);
|
|
|
|
+ guard.setsuid(uid);
|
|
|
|
+ } else if uid == guard.uid.data() || uid == guard.suid.data() {
|
|
|
|
+ guard.seteuid(uid);
|
|
|
|
+ } else {
|
|
|
|
+ return Err(SystemError::EPERM);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return Ok(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pub fn setgid(gid: usize) -> Result<usize, SystemError> {
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ let mut guard = pcb.cred.lock();
|
|
|
|
+
|
|
|
|
+ if guard.egid.data() == 0 {
|
|
|
|
+ guard.setgid(gid);
|
|
|
|
+ guard.setegid(gid);
|
|
|
|
+ guard.setsgid(gid);
|
|
|
|
+ guard.setfsgid(gid);
|
|
|
|
+ } else if guard.gid.data() == gid || guard.sgid.data() == gid {
|
|
|
|
+ guard.setegid(gid);
|
|
|
|
+ guard.setfsgid(gid);
|
|
|
|
+ } else {
|
|
|
|
+ return Err(SystemError::EPERM);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return Ok(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pub fn seteuid(euid: usize) -> Result<usize, SystemError> {
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ let mut guard = pcb.cred.lock();
|
|
|
|
+
|
|
|
|
+ if euid == usize::MAX || (euid == guard.euid.data() && euid == guard.fsuid.data()) {
|
|
|
|
+ return Ok(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if euid != usize::MAX {
|
|
|
|
+ guard.seteuid(euid);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let euid = guard.euid.data();
|
|
|
|
+ guard.setfsuid(euid);
|
|
|
|
+
|
|
|
|
+ return Ok(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pub fn setegid(egid: usize) -> Result<usize, SystemError> {
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ let mut guard = pcb.cred.lock();
|
|
|
|
+
|
|
|
|
+ if egid == usize::MAX || (egid == guard.egid.data() && egid == guard.fsgid.data()) {
|
|
|
|
+ return Ok(0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if egid != usize::MAX {
|
|
|
|
+ guard.setegid(egid);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let egid = guard.egid.data();
|
|
|
|
+ guard.setfsgid(egid);
|
|
|
|
+
|
|
return Ok(0);
|
|
return Ok(0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ pub fn setfsuid(fsuid: usize) -> Result<usize, SystemError> {
|
|
|
|
+ let fsuid = Kuid::new(fsuid);
|
|
|
|
+
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ let mut guard = pcb.cred.lock();
|
|
|
|
+ let old_fsuid = guard.fsuid;
|
|
|
|
+
|
|
|
|
+ if fsuid == guard.uid || fsuid == guard.euid || fsuid == guard.suid {
|
|
|
|
+ guard.setfsuid(fsuid.data());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Ok(old_fsuid.data())
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pub fn setfsgid(fsgid: usize) -> Result<usize, SystemError> {
|
|
|
|
+ let fsgid = Kgid::new(fsgid);
|
|
|
|
+
|
|
|
|
+ let pcb = ProcessManager::current_pcb();
|
|
|
|
+ let mut guard = pcb.cred.lock();
|
|
|
|
+ let old_fsgid = guard.fsgid;
|
|
|
|
+
|
|
|
|
+ if fsgid == guard.gid || fsgid == guard.egid || fsgid == guard.sgid {
|
|
|
|
+ guard.setfsgid(fsgid.data());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Ok(old_fsgid.data())
|
|
|
|
+ }
|
|
|
|
+
|
|
pub fn get_rusage(who: i32, rusage: *mut RUsage) -> Result<usize, SystemError> {
|
|
pub fn get_rusage(who: i32, rusage: *mut RUsage) -> Result<usize, SystemError> {
|
|
let who = RUsageWho::try_from(who)?;
|
|
let who = RUsageWho::try_from(who)?;
|
|
let mut writer = UserBufferWriter::new(rusage, core::mem::size_of::<RUsage>(), true)?;
|
|
let mut writer = UserBufferWriter::new(rusage, core::mem::size_of::<RUsage>(), true)?;
|