From ec216e56e281ff82fe62d5a2ccdb0fa4c2ad8961 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Wed, 25 Sep 2024 20:28:50 +0200 Subject: [PATCH] Preserve umask across execv. --- redox-rt/src/proc.rs | 5 +++++ src/platform/auxv_defs.rs | 3 +++ src/platform/mod.rs | 9 +++++++++ src/platform/redox/exec.rs | 1 + 4 files changed, 18 insertions(+) diff --git a/redox-rt/src/proc.rs b/redox-rt/src/proc.rs index 360c18a14b..81fad4f262 100644 --- a/redox-rt/src/proc.rs +++ b/redox-rt/src/proc.rs @@ -51,6 +51,8 @@ pub struct ExtraInfo<'a> { pub sigignmask: u64, // POSIX also states that the sigprocmask must be preserved across execs. pub sigprocmask: u64, + /// File mode creation mask (POSIX) + pub umask: u32, } pub fn fexec_impl( @@ -422,6 +424,9 @@ where push(extrainfo.sigprocmask as usize)?; push(AT_REDOX_INHERITED_SIGPROCMASK)?; + push(extrainfo.umask as usize)?; + push(AT_REDOX_UMASK); + push(0)?; for env in envs { diff --git a/src/platform/auxv_defs.rs b/src/platform/auxv_defs.rs index 814eab2499..ae9a6d36a1 100644 --- a/src/platform/auxv_defs.rs +++ b/src/platform/auxv_defs.rs @@ -45,3 +45,6 @@ pub const AT_REDOX_INHERITED_SIGPROCMASK_HI: usize = 37; pub const AT_REDOX_INITIAL_DEFAULT_SCHEME_PTR: usize = 38; #[cfg(target_os = "redox")] pub const AT_REDOX_INITIAL_DEFAULT_SCHEME_LEN: usize = 39; + +#[cfg(target_os = "redox")] +pub const AT_REDOX_UMASK: usize = 40; diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 9fd855a7da..9b51834582 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -287,6 +287,10 @@ pub fn get_auxv(auxvs: &[[usize; 2]], key: usize) -> Option { pub unsafe fn init(auxvs: Box<[[usize; 2]]>) { redox_rt::initialize(); + use syscall::MODE_PERM; + + use crate::header::sys_stat::S_ISVTX; + use self::auxv_defs::*; if let (Some(cwd_ptr), Some(cwd_len)) = ( @@ -320,6 +324,11 @@ pub unsafe fn init(auxvs: Box<[[usize; 2]]>) { inherited_sigprocmask |= (mask as u64) << 32; } redox_rt::signal::set_sigmask(Some(inherited_sigprocmask), None).unwrap(); + + if let Some(umask) = get_auxv(&auxvs, AT_REDOX_UMASK) { + let _ = + redox_rt::sys::swap_umask((umask as u32) & u32::from(MODE_PERM) & !(S_ISVTX as u32)); + } } #[cfg(not(target_os = "redox"))] pub fn init(auxvs: Box<[[usize; 2]]>) {} diff --git a/src/platform/redox/exec.rs b/src/platform/redox/exec.rs index 6b8c3856c7..990502bdd6 100644 --- a/src/platform/redox/exec.rs +++ b/src/platform/redox/exec.rs @@ -317,6 +317,7 @@ pub fn execve( default_scheme: Some(&default_scheme), sigignmask: 0, sigprocmask, + umask: redox_rt::sys::get_umask(), }; fexec_impl( exec_fd_guard,