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,