mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 19:07:35 +00:00
Kernel: Try to do the right thing by default for unhandled signals.
This commit is contained in:
parent
b0c673265a
commit
725b57fe1f
1 changed files with 67 additions and 5 deletions
|
@ -796,6 +796,59 @@ ShouldUnblockProcess Process::dispatch_one_pending_signal()
|
||||||
return dispatch_signal(signal);
|
return dispatch_signal(signal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum class DefaultSignalAction {
|
||||||
|
Terminate,
|
||||||
|
Ignore,
|
||||||
|
DumpCore,
|
||||||
|
Stop,
|
||||||
|
Continue,
|
||||||
|
};
|
||||||
|
|
||||||
|
DefaultSignalAction default_signal_action(byte signal)
|
||||||
|
{
|
||||||
|
ASSERT(signal && signal < NSIG);
|
||||||
|
|
||||||
|
switch (signal) {
|
||||||
|
case SIGHUP:
|
||||||
|
case SIGINT:
|
||||||
|
case SIGKILL:
|
||||||
|
case SIGPIPE:
|
||||||
|
case SIGALRM:
|
||||||
|
case SIGUSR1:
|
||||||
|
case SIGUSR2:
|
||||||
|
case SIGVTALRM:
|
||||||
|
case SIGSTKFLT:
|
||||||
|
case SIGIO:
|
||||||
|
case SIGPROF:
|
||||||
|
case SIGTERM:
|
||||||
|
case SIGPWR:
|
||||||
|
return DefaultSignalAction::Terminate;
|
||||||
|
case SIGCHLD:
|
||||||
|
case SIGURG:
|
||||||
|
case SIGWINCH:
|
||||||
|
return DefaultSignalAction::Ignore;
|
||||||
|
case SIGQUIT:
|
||||||
|
case SIGILL:
|
||||||
|
case SIGTRAP:
|
||||||
|
case SIGABRT:
|
||||||
|
case SIGBUS:
|
||||||
|
case SIGFPE:
|
||||||
|
case SIGSEGV:
|
||||||
|
case SIGXCPU:
|
||||||
|
case SIGXFSZ:
|
||||||
|
case SIGSYS:
|
||||||
|
return DefaultSignalAction::DumpCore;
|
||||||
|
case SIGCONT:
|
||||||
|
return DefaultSignalAction::Continue;
|
||||||
|
case SIGSTOP:
|
||||||
|
case SIGTSTP:
|
||||||
|
case SIGTTIN:
|
||||||
|
case SIGTTOU:
|
||||||
|
return DefaultSignalAction::Stop;
|
||||||
|
}
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
ShouldUnblockProcess Process::dispatch_signal(byte signal)
|
ShouldUnblockProcess Process::dispatch_signal(byte signal)
|
||||||
{
|
{
|
||||||
ASSERT_INTERRUPTS_DISABLED();
|
ASSERT_INTERRUPTS_DISABLED();
|
||||||
|
@ -814,20 +867,29 @@ ShouldUnblockProcess Process::dispatch_signal(byte signal)
|
||||||
set_state(Stopped);
|
set_state(Stopped);
|
||||||
return ShouldUnblockProcess::No;
|
return ShouldUnblockProcess::No;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool did_continue_stopped_process = false;
|
||||||
if (signal == SIGCONT && state() == Stopped) {
|
if (signal == SIGCONT && state() == Stopped) {
|
||||||
set_state(Runnable);
|
set_state(Runnable);
|
||||||
return ShouldUnblockProcess::Yes;
|
did_continue_stopped_process = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto handler_laddr = action.handler_or_sigaction;
|
auto handler_laddr = action.handler_or_sigaction;
|
||||||
if (handler_laddr.is_null()) {
|
if (handler_laddr.is_null()) {
|
||||||
if (signal == SIGSTOP) {
|
switch (default_signal_action(signal)) {
|
||||||
|
case DefaultSignalAction::Stop:
|
||||||
set_state(Stopped);
|
set_state(Stopped);
|
||||||
} else {
|
return ShouldUnblockProcess::No;
|
||||||
// FIXME: Is termination really always the appropriate action?
|
case DefaultSignalAction::Continue:
|
||||||
|
return did_continue_stopped_process ? ShouldUnblockProcess::Yes : ShouldUnblockProcess::No;
|
||||||
|
case DefaultSignalAction::DumpCore:
|
||||||
|
case DefaultSignalAction::Terminate:
|
||||||
terminate_due_to_signal(signal);
|
terminate_due_to_signal(signal);
|
||||||
|
return ShouldUnblockProcess::No;
|
||||||
|
case DefaultSignalAction::Ignore:
|
||||||
|
return ShouldUnblockProcess::No;
|
||||||
}
|
}
|
||||||
return ShouldUnblockProcess::No;
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handler_laddr.as_ptr() == SIG_IGN) {
|
if (handler_laddr.as_ptr() == SIG_IGN) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue