Preserve umask across execv.
This commit is contained in:
@@ -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<A, E>(
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -287,6 +287,10 @@ pub fn get_auxv(auxvs: &[[usize; 2]], key: usize) -> Option<usize> {
|
||||
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]]>) {}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user