diff --git a/redox-rt/src/lib.rs b/redox-rt/src/lib.rs index 985ca1db8d..43cfb811cf 100644 --- a/redox-rt/src/lib.rs +++ b/redox-rt/src/lib.rs @@ -206,25 +206,29 @@ pub unsafe fn initialize(#[cfg(feature = "proc")] proc_fd: FdGuard) { { *DYNAMIC_PROC_INFO.lock() = DynamicProcInfo { pgid: metadata.pgid, - egid: metadata.egid, - euid: metadata.euid, ruid: metadata.ruid, + euid: metadata.euid, + suid: metadata.suid, + egid: metadata.egid, rgid: metadata.rgid, + sgid: metadata.sgid, }; } } pub(crate) struct StaticProcInfo { pid: u32, - ppid: u32, + ppid: u32, // TODO: dynamic proc_fd: Option, } struct DynamicProcInfo { pgid: u32, euid: u32, + suid: u32, ruid: u32, egid: u32, rgid: u32, + sgid: u32, } static STATIC_PROC_INFO: SyncUnsafeCell = SyncUnsafeCell::new(StaticProcInfo { @@ -234,10 +238,12 @@ static STATIC_PROC_INFO: SyncUnsafeCell = SyncUnsafeCell::new(St }); static DYNAMIC_PROC_INFO: Mutex = Mutex::new(DynamicProcInfo { pgid: u32::MAX, - euid: u32::MAX, - egid: u32::MAX, ruid: u32::MAX, + euid: u32::MAX, + suid: u32::MAX, rgid: u32::MAX, + egid: u32::MAX, + sgid: u32::MAX, }); #[inline] diff --git a/redox-rt/src/proc.rs b/redox-rt/src/proc.rs index 84a50d6fae..78aa939dde 100644 --- a/redox-rt/src/proc.rs +++ b/redox-rt/src/proc.rs @@ -937,10 +937,12 @@ pub unsafe fn make_init() -> &'static FdGuard { }); *DYNAMIC_PROC_INFO.lock() = crate::DynamicProcInfo { pgid: 1, - egid: 0, - euid: 0, - rgid: 0, ruid: 0, + euid: 0, + suid: 0, + rgid: 0, + egid: 0, + sgid: 0, }; (*STATIC_PROC_INFO.get()).proc_fd.as_ref().unwrap() } diff --git a/redox-rt/src/protocol.rs b/redox-rt/src/protocol.rs index 25b9323bd8..6161efe411 100644 --- a/redox-rt/src/protocol.rs +++ b/redox-rt/src/protocol.rs @@ -1,14 +1,17 @@ use bitflags::bitflags; #[derive(Clone, Copy, Debug, Default)] +#[repr(C)] pub struct ProcMeta { pub pid: u32, pub pgid: u32, pub ppid: u32, - pub euid: u32, pub ruid: u32, - pub egid: u32, + pub euid: u32, + pub suid: u32, pub rgid: u32, + pub egid: u32, + pub sgid: u32, pub ens: u32, pub rns: u32, } diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index 9d8565468e..8f299c0379 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -14,7 +14,7 @@ use crate::{ proc::FdGuard, protocol::{ProcCall, ProcKillTarget, WaitFlags}, signal::tmp_disable_signals, - Tcb, DYNAMIC_PROC_INFO, + DynamicProcInfo, Tcb, DYNAMIC_PROC_INFO, }; #[inline] @@ -189,14 +189,18 @@ pub fn get_umask() -> u32 { UMASK.load(Ordering::Acquire) } -pub fn posix_setresugid( - ruid: Option, - euid: Option, - suid: Option, - rgid: Option, - egid: Option, - sgid: Option, -) -> Result<()> { +/// Real/Effective/Set-User/Group ID +pub struct Resugid { + pub ruid: T, + pub euid: T, + pub suid: T, + pub rgid: T, + pub egid: T, + pub sgid: T, +} + +/// Sets [res][ug]id, fields that are None will be unchanged. +pub fn posix_setresugid(ids: &Resugid>) -> Result<()> { // TODO: not sure how "tmp" an IPC call is? let _sig_guard = tmp_disable_signals(); let mut guard = DYNAMIC_PROC_INFO.lock(); @@ -205,12 +209,12 @@ pub fn posix_setresugid( 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), + ids.ruid.unwrap_or(u32::MAX), + ids.euid.unwrap_or(u32::MAX), + ids.suid.unwrap_or(u32::MAX), + ids.rgid.unwrap_or(u32::MAX), + ids.egid.unwrap_or(u32::MAX), + ids.sgid.unwrap_or(u32::MAX), ]); proc_call( @@ -219,38 +223,46 @@ pub fn posix_setresugid( &[ProcCall::SetResugid as usize], )?; - if let Some(ruid) = ruid { + if let Some(ruid) = ids.ruid { guard.ruid = ruid; } - if let Some(euid) = euid { + if let Some(euid) = ids.euid { guard.euid = euid; } - // TODO: suid? - if let Some(rgid) = rgid { + if let Some(suid) = ids.suid { + guard.suid = suid; + } + if let Some(rgid) = ids.rgid { guard.rgid = rgid; } - if let Some(egid) = egid { + if let Some(egid) = ids.egid { guard.egid = egid; } - // TODO: sgid? + if let Some(sgid) = ids.sgid { + guard.sgid = 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_getresugid() -> Resugid { + let _sig_guard = tmp_disable_signals(); + let DynamicProcInfo { + ruid, + euid, + suid, + rgid, + egid, + sgid, + .. + } = *DYNAMIC_PROC_INFO.lock(); + Resugid { + ruid, + euid, + suid, + rgid, + egid, + sgid, + } } pub fn posix_exit(status: i32) -> ! { proc_call( diff --git a/src/platform/redox/exec.rs b/src/platform/redox/exec.rs index 660a67332e..c7f9aed4b9 100644 --- a/src/platform/redox/exec.rs +++ b/src/platform/redox/exec.rs @@ -16,6 +16,7 @@ use crate::{ use redox_rt::{ proc::{ExtraInfo, FdGuard, FexecResult, InterpOverride}, + sys::Resugid, RtTcb, }; use syscall::{data::Stat, error::*, flag::*}; @@ -120,12 +121,11 @@ pub fn execve( let mut stat = Stat::default(); syscall::fstat(*image_file as usize, &mut stat)?; - let uid = redox_rt::sys::posix_getruid() as usize; - let gid = redox_rt::sys::posix_getrgid() as usize; + let Resugid { ruid, rgid, .. } = redox_rt::sys::posix_getresugid(); - let mode = if uid == stat.st_uid as usize { + let mode = if ruid == stat.st_uid { (stat.st_mode >> 3 * 2) & 0o7 - } else if gid == stat.st_gid as usize { + } else if rgid == stat.st_gid { (stat.st_mode >> 3 * 1) & 0o7 } else { stat.st_mode & 0o7 diff --git a/src/platform/redox/libredox.rs b/src/platform/redox/libredox.rs index 29efa7caf8..5e5bcad345 100644 --- a/src/platform/redox/libredox.rs +++ b/src/platform/redox/libredox.rs @@ -227,19 +227,19 @@ pub unsafe extern "C" fn redox_get_pid_v1() -> RawResult { #[no_mangle] pub unsafe extern "C" fn redox_get_euid_v1() -> RawResult { - redox_rt::sys::posix_geteuid() as _ + redox_rt::sys::posix_getresugid().euid as _ } #[no_mangle] pub unsafe extern "C" fn redox_get_ruid_v1() -> RawResult { - redox_rt::sys::posix_getruid() as _ + redox_rt::sys::posix_getresugid().ruid as _ } #[no_mangle] pub unsafe extern "C" fn redox_get_egid_v1() -> RawResult { - redox_rt::sys::posix_getegid() as _ + redox_rt::sys::posix_getresugid().egid as _ } #[no_mangle] pub unsafe extern "C" fn redox_get_rgid_v1() -> RawResult { - redox_rt::sys::posix_getrgid() as _ + redox_rt::sys::posix_getresugid().rgid as _ } #[no_mangle] pub unsafe extern "C" fn redox_setrens_v1(rns: usize, ens: usize) -> RawResult { diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index c2fee23574..07612a5d42 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -5,7 +5,7 @@ use core::{ }; use redox_rt::{ protocol::{wifstopped, wstopsig, WaitFlags}, - sys::WaitpidTarget, + sys::{Resugid, WaitpidTarget}, RtTcb, }; use syscall::{ @@ -104,12 +104,11 @@ impl Pal for Sys { syscall::fstat(*fd as usize, &mut stat)?; - let uid = redox_rt::sys::posix_getruid() as usize; - let gid = redox_rt::sys::posix_getrgid() as usize; + let Resugid { ruid, rgid, .. } = redox_rt::sys::posix_getresugid(); - let perms = if stat.st_uid as usize == uid { + let perms = if stat.st_uid == ruid { stat.st_mode >> (3 * 2 & 0o7) - } else if stat.st_gid as usize == gid { + } else if stat.st_gid == rgid { stat.st_mode >> (3 * 1 & 0o7) } else { stat.st_mode & 0o7 @@ -412,15 +411,15 @@ impl Pal for Sys { } fn getegid() -> gid_t { - redox_rt::sys::posix_getegid() as gid_t + redox_rt::sys::posix_getresugid().egid as gid_t } fn geteuid() -> uid_t { - redox_rt::sys::posix_geteuid() as uid_t + redox_rt::sys::posix_getresugid().euid as uid_t } fn getgid() -> gid_t { - redox_rt::sys::posix_getrgid() as gid_t + redox_rt::sys::posix_getresugid().rgid as gid_t } unsafe fn getgroups(size: c_int, list: *mut gid_t) -> Result { @@ -528,7 +527,7 @@ impl Pal for Sys { } fn getuid() -> uid_t { - redox_rt::sys::posix_getruid() as uid_t + redox_rt::sys::posix_getresugid().ruid as uid_t } fn lchown(path: CStr, owner: uid_t, group: gid_t) -> Result<()> { @@ -858,26 +857,26 @@ impl Pal for Sys { } fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> Result<()> { - redox_rt::sys::posix_setresugid( - None, - None, - None, - cvt_uid(rgid)?, - cvt_uid(egid)?, - cvt_uid(sgid)?, - )?; + redox_rt::sys::posix_setresugid(&Resugid { + ruid: None, + euid: None, + suid: None, + rgid: cvt_uid(rgid)?, + egid: cvt_uid(egid)?, + sgid: cvt_uid(sgid)?, + })?; Ok(()) } fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> Result<()> { - redox_rt::sys::posix_setresugid( - cvt_uid(ruid)?, - cvt_uid(euid)?, - cvt_uid(suid)?, - None, - None, - None, - )?; + redox_rt::sys::posix_setresugid(&Resugid { + ruid: cvt_uid(ruid)?, + euid: cvt_uid(euid)?, + suid: cvt_uid(suid)?, + rgid: None, + egid: None, + sgid: None, + })?; Ok(()) }