Preserve umask across execv.

This commit is contained in:
4lDO2
2024-09-25 20:28:50 +02:00
parent 47f44ee12f
commit ec216e56e2
4 changed files with 18 additions and 0 deletions
+5
View File
@@ -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 {
+3
View File
@@ -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;
+9
View File
@@ -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]]>) {}
+1
View File
@@ -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,