diff --git a/redox-rt/src/protocol.rs b/redox-rt/src/protocol.rs index e636679021..7ea959b702 100644 --- a/redox-rt/src/protocol.rs +++ b/redox-rt/src/protocol.rs @@ -21,6 +21,7 @@ pub enum ProcCall { Setrens = 1, Exit = 2, Waitpgid = 3, + SetResugid = 4, } impl ProcCall { diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index 86645d061b..8ac95c9288 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -190,22 +190,67 @@ pub fn get_umask() -> u32 { UMASK.load(Ordering::Acquire) } -pub fn posix_setresuid(ruid: Option, euid: Option, suid: Option) -> Result<()> { - todo!("posix_setresuid") -} -pub fn posix_setresgid(rgid: Option, egid: Option, sgid: Option) -> Result<()> { - todo!("posix_setresgid") +pub fn posix_setresugid( + ruid: Option, + euid: Option, + suid: Option, + rgid: Option, + egid: Option, + sgid: Option, +) -> Result<()> { + // TODO: not sure how "tmp" an IPC call is? + let _sig_guard = tmp_disable_signals(); + let mut guard = DYNAMIC_PROC_INFO.lock(); + + let mut buf = [0_u8; size_of::() * 6]; + plain::slice_from_mut_bytes(&mut buf) + .unwrap() + .copy_from_slice(&[ + ruid.unwrap_or(u32::MAX), + euid.unwrap_or(u32::MAX), + suid.unwrap_or(u32::MAX), + rgid.unwrap_or(u32::MAX), + egid.unwrap_or(u32::MAX), + sgid.unwrap_or(u32::MAX), + ]); + + proc_call( + &mut buf, + CallFlags::empty(), + &[ProcCall::SetResugid as usize], + )?; + + if let Some(ruid) = ruid { + guard.ruid = ruid; + } + if let Some(euid) = euid { + guard.euid = euid; + } + // TODO: suid? + if let Some(rgid) = rgid { + guard.rgid = rgid; + } + if let Some(egid) = egid { + guard.egid = egid; + } + // TODO: sgid? + + Ok(()) } pub fn posix_getruid() -> u32 { + let _guard = tmp_disable_signals(); DYNAMIC_PROC_INFO.lock().ruid } pub fn posix_getrgid() -> u32 { + let _guard = tmp_disable_signals(); DYNAMIC_PROC_INFO.lock().rgid } pub fn posix_geteuid() -> u32 { + let _guard = tmp_disable_signals(); DYNAMIC_PROC_INFO.lock().euid } pub fn posix_getegid() -> u32 { + let _guard = tmp_disable_signals(); DYNAMIC_PROC_INFO.lock().egid } pub fn posix_exit(status: i32) -> ! { diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 05882754bf..50faa29ce4 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -864,7 +864,10 @@ impl Pal for Sys { } fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> Result<()> { - Ok(redox_rt::sys::posix_setresgid( + Ok(redox_rt::sys::posix_setresugid( + None, + None, + None, cvt_uid(rgid)?, cvt_uid(egid)?, cvt_uid(sgid)?, @@ -872,10 +875,13 @@ impl Pal for Sys { } fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> Result<()> { - Ok(redox_rt::sys::posix_setresuid( + Ok(redox_rt::sys::posix_setresugid( cvt_uid(ruid)?, cvt_uid(euid)?, cvt_uid(suid)?, + None, + None, + None, )?) }