Add setresguid.

This commit is contained in:
4lDO2
2025-03-29 12:32:38 +01:00
parent 48df8f5bba
commit f4a64cfbc3
3 changed files with 59 additions and 7 deletions
+1
View File
@@ -21,6 +21,7 @@ pub enum ProcCall {
Setrens = 1,
Exit = 2,
Waitpgid = 3,
SetResugid = 4,
}
impl ProcCall {
+50 -5
View File
@@ -190,22 +190,67 @@ pub fn get_umask() -> u32 {
UMASK.load(Ordering::Acquire)
}
pub fn posix_setresuid(ruid: Option<u32>, euid: Option<u32>, suid: Option<u32>) -> Result<()> {
todo!("posix_setresuid")
}
pub fn posix_setresgid(rgid: Option<u32>, egid: Option<u32>, sgid: Option<u32>) -> Result<()> {
todo!("posix_setresgid")
pub fn posix_setresugid(
ruid: Option<u32>,
euid: Option<u32>,
suid: Option<u32>,
rgid: Option<u32>,
egid: Option<u32>,
sgid: Option<u32>,
) -> 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::<u32>() * 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) -> ! {
+8 -2
View File
@@ -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,
)?)
}