sys_setuid.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use crate::arch::interrupt::TrapFrame;
  2. use crate::arch::syscall::nr::SYS_SETUID;
  3. use crate::process::ProcessManager;
  4. use crate::syscall::table::FormattedSyscallParam;
  5. use crate::syscall::table::Syscall;
  6. use alloc::vec::Vec;
  7. use system_error::SystemError;
  8. pub struct SysSetUid;
  9. impl SysSetUid {
  10. fn uid(args: &[usize]) -> usize {
  11. args[0]
  12. }
  13. }
  14. impl Syscall for SysSetUid {
  15. fn num_args(&self) -> usize {
  16. 1
  17. }
  18. fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result<usize, SystemError> {
  19. let uid = Self::uid(args);
  20. let pcb = ProcessManager::current_pcb();
  21. let mut guard = pcb.cred.lock();
  22. if guard.uid.data() == 0 {
  23. guard.setuid(uid);
  24. guard.seteuid(uid);
  25. guard.setsuid(uid);
  26. } else if uid == guard.uid.data() || uid == guard.suid.data() {
  27. guard.seteuid(uid);
  28. } else {
  29. return Err(SystemError::EPERM);
  30. }
  31. return Ok(0);
  32. }
  33. fn entry_format(&self, args: &[usize]) -> Vec<FormattedSyscallParam> {
  34. vec![FormattedSyscallParam::new(
  35. "uid",
  36. format!("{:#x}", Self::uid(args)),
  37. )]
  38. }
  39. }
  40. syscall_table_macros::declare_syscall!(SYS_SETUID, SysSetUid);