From 8ac0626be74e00f84ba18fca94e2e61cd3b48068 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Mon, 18 Jul 2022 14:09:48 +0200 Subject: [PATCH] Handle sigactions properly in execve and fork. --- src/platform/redox/clone.rs | 17 +++++++++++++++++ src/platform/redox/redox-exec/src/lib.rs | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/src/platform/redox/clone.rs b/src/platform/redox/clone.rs index c409b6901..a01e8c63e 100644 --- a/src/platform/redox/clone.rs +++ b/src/platform/redox/clone.rs @@ -93,6 +93,15 @@ pub unsafe fn pte_clone_impl(stack: *mut usize) -> Result<usize> { let _ = syscall::write(*new_filetable_sel_fd, &usize::to_ne_bytes(*cur_filetable_fd))?; } + // Reuse sigactions (on Linux, CLONE_THREAD requires CLONE_SIGHAND which implies the sigactions + // table is reused). + { + let cur_sigaction_fd = FdGuard::new(syscall::dup(*cur_pid_fd, b"sigactions")?); + let new_sigaction_sel_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"current-sigactions")?); + + let _ = syscall::write(*new_sigaction_sel_fd, &usize::to_ne_bytes(*cur_sigaction_fd))?; + } + copy_env_regs(*cur_pid_fd, *new_pid_fd)?; // Unblock context. @@ -131,6 +140,14 @@ fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { copy_str(*cur_pid_fd, *new_pid_fd, "name")?; copy_str(*cur_pid_fd, *new_pid_fd, "cwd")?; + { + let cur_sigaction_fd = FdGuard::new(syscall::dup(*cur_pid_fd, b"sigactions")?); + let new_sigaction_fd = FdGuard::new(syscall::dup(*cur_sigaction_fd, b"copy")?); + let new_sigaction_sel_fd = FdGuard::new(syscall::dup(*new_pid_fd, b"current-sigactions")?); + + let _ = syscall::write(*new_sigaction_sel_fd, &usize::to_ne_bytes(*new_sigaction_fd))?; + } + // Copy existing files into new file table, but do not reuse the same file table (i.e. new // parent FDs will not show up for the child). { diff --git a/src/platform/redox/redox-exec/src/lib.rs b/src/platform/redox/redox-exec/src/lib.rs index f40e5535b..13f0c10f4 100644 --- a/src/platform/redox/redox-exec/src/lib.rs +++ b/src/platform/redox/redox-exec/src/lib.rs @@ -166,6 +166,14 @@ where unsafe { deactivate_tcb(*open_via_dup)?; } + { + let current_sigaction_fd = FdGuard::new(syscall::dup(*open_via_dup, b"sigactions")?); + let empty_sigaction_fd = FdGuard::new(syscall::dup(*current_sigaction_fd, b"empty")?); + let sigaction_selection_fd = FdGuard::new(syscall::dup(*open_via_dup, b"current-sigactions")?); + + let _ = syscall::write(*sigaction_selection_fd, &usize::to_ne_bytes(*empty_sigaction_fd))?; + } + // TODO: Restore old name if exec failed? if let Ok(name_fd) = syscall::dup(*open_via_dup, b"name").map(FdGuard::new) { let _ = syscall::write(*name_fd, path); -- GitLab