alnyan/yggdrasil: prevent crash loop when handling signals

This commit is contained in:
Mark Poliakov 2024-11-06 20:06:29 +02:00
parent f076438d64
commit e1a6fab885

View File

@ -55,8 +55,11 @@ pub(crate) unsafe fn set_signal_handler(signal: Signal, handler: SignalHandler)
}
unsafe extern "C" fn common_signal_entry(data: &SignalEntryData) -> ! {
use crate::io::Write;
let handler = SIGNAL_TABLE.lookup(data.signal).unwrap_or(SignalHandler::Terminate);
let pid = crate::process::id();
let mut stderr = crate::io::stderr();
match handler {
SignalHandler::Function(f) => {
@ -64,11 +67,11 @@ unsafe extern "C" fn common_signal_entry(data: &SignalEntryData) -> ! {
sys::exit_signal(data);
}
SignalHandler::Ignore => {
eprintln!("#{}: ignored {:?}", pid, data.signal);
writeln!(stderr, "#{}: ignored {:?}", pid, data.signal).ok();
sys::exit_signal(data);
}
SignalHandler::Terminate => {
eprintln!("#{}: {:?}", pid, data.signal);
writeln!(stderr, "#{}: {:?}", pid, data.signal).ok();
sys::exit_process(OsExitCode::BySignal(data.signal));
}
}