Simplify [res][ug]id getters and setters.

This commit is contained in:
4lDO2
2025-03-31 12:55:43 +02:00
parent 9999bb6068
commit 8bd510ff59
7 changed files with 101 additions and 79 deletions
+11 -5
View File
@@ -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<FdGuard>,
}
struct DynamicProcInfo {
pgid: u32,
euid: u32,
suid: u32,
ruid: u32,
egid: u32,
rgid: u32,
sgid: u32,
}
static STATIC_PROC_INFO: SyncUnsafeCell<StaticProcInfo> = SyncUnsafeCell::new(StaticProcInfo {
@@ -234,10 +238,12 @@ static STATIC_PROC_INFO: SyncUnsafeCell<StaticProcInfo> = SyncUnsafeCell::new(St
});
static DYNAMIC_PROC_INFO: Mutex<DynamicProcInfo> = 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]
+5 -3
View File
@@ -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()
}
+5 -2
View File
@@ -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,
}
+48 -36
View File
@@ -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<u32>,
euid: Option<u32>,
suid: Option<u32>,
rgid: Option<u32>,
egid: Option<u32>,
sgid: Option<u32>,
) -> Result<()> {
/// Real/Effective/Set-User/Group ID
pub struct Resugid<T> {
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<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();
@@ -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<u32> {
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(
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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 {
+24 -25
View File
@@ -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<c_int> {
@@ -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(())
}