diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index fe217af4..4d176d77 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -2505,14 +2505,7 @@ namespace Kernel *oact = m_signal_handlers[signal]; if (act) - { - if (act->sa_flags & ~(SA_RESTART)) - { - dwarnln("TODO: sigaction({}, {H})", signal, act->sa_flags); - return BAN::Error::from_errno(ENOTSUP); - } m_signal_handlers[signal] = *act; - } return 0; } diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index f58072c2..52db624d 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -507,9 +507,16 @@ namespace Kernel bool has_sa_restart; { SpinLockGuard _(m_process->m_signal_lock); - ASSERT(!(m_process->m_signal_handlers[signal].sa_flags & SA_SIGINFO)); - signal_handler = (vaddr_t)m_process->m_signal_handlers[signal].sa_handler; - has_sa_restart = !!(m_process->m_signal_handlers[signal].sa_flags & SA_RESTART); + + auto& handler = m_process->m_signal_handlers[signal]; + + ASSERT(!(handler.sa_flags & SA_SIGINFO)); + + signal_handler = reinterpret_cast(handler.sa_handler); + if (handler.sa_flags & SA_RESETHAND) + handler.sa_handler = SIG_DFL; + + has_sa_restart = !!(handler.sa_flags & SA_RESTART); } m_signal_pending_mask &= ~(1ull << signal);