Simplify [res][ug]id getters and setters.
This commit is contained in:
+11
-5
@@ -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]
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user