diff --git a/src/signals.rs b/src/signals.rs index 735d4fa..df27d1f 100644 --- a/src/signals.rs +++ b/src/signals.rs @@ -194,12 +194,10 @@ pub fn exit_with_status(status: ExitStatus) -> ! { } fn kill_self_with(number: i32) -> ! { - if let Ok(signal) = Signal::try_from(number) { - let _ = prctl::set_dumpable(false); - let _ = unsafe { signal::signal(signal, SigHandler::SigDfl) }; - let _ = SigSet::from(signal).thread_unblock(); - let _ = signal::raise(signal); - } + let _ = prctl::set_dumpable(false); + unsafe { libc::signal(number, libc::SIG_DFL) }; + let _ = to_sigset([number]).thread_unblock(); + unsafe { libc::raise(number) }; process::exit(128 + number) } diff --git a/tests/e2e/forwarding.rs b/tests/e2e/forwarding.rs index 289be44..d505fbe 100644 --- a/tests/e2e/forwarding.rs +++ b/tests/e2e/forwarding.rs @@ -50,6 +50,21 @@ fn forwarded_signal_death_of_entrypoint_is_mirrored() { assert_eq!(status.signal(), Some(libc::SIGTERM)); } +#[test] +fn forwarded_realtime_signal_death_of_entrypoint_is_mirrored() { + let dir = TempDir::new().expect("failed to create temp dir"); + let realtime = libc::SIGRTMIN() + 1; + let script = ": > ready + sleep 60"; + + let (_sandbox, mut child) = spawn_sandbox(&["--blacklist"], dir.path(), script); + wait_for_file(&dir.path().join("ready")); + send_signal(&child, realtime); + let status = child.wait().unwrap(); + + assert_eq!(status.signal(), Some(realtime)); +} + #[test] fn user_and_realtime_signals_reach_entrypoint() { let dir = TempDir::new().expect("failed to create temp dir");