diff --git a/headers/private/kernel/ksignal.h b/headers/private/kernel/ksignal.h index 940a906131..e80c013fd5 100644 --- a/headers/private/kernel/ksignal.h +++ b/headers/private/kernel/ksignal.h @@ -29,6 +29,8 @@ extern bool is_kill_signal_pending(void); extern int has_signals_pending(void *_thread); extern bool is_signal_blocked(int signal); +extern void update_current_thread_signals_flag(); + extern int sigaction_etc(thread_id threadID, int signal, const struct sigaction *newAction, struct sigaction *oldAction); diff --git a/src/system/kernel/arch/x86/arch_thread.cpp b/src/system/kernel/arch/x86/arch_thread.cpp index e27a649454..aa4f4abaae 100644 --- a/src/system/kernel/arch/x86/arch_thread.cpp +++ b/src/system/kernel/arch/x86/arch_thread.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -546,7 +547,11 @@ arch_restore_signal_frame(void) atomic_or(&thread->flags, threadFlags & (THREAD_FLAGS_RESTART_SYSCALL | THREAD_FLAGS_64_BIT_SYSCALL_RETURN)); + // TODO: Verify that just restoring the old signal mask is right! Bash for + // instance changes the procmask in a signal handler. Those changes are + // lost the way we do it. atomic_set(&thread->sig_block_mask, signalMask); + update_current_thread_signals_flag(); frame->eip = regs.eip; frame->flags = regs.eflags; diff --git a/src/system/kernel/signal.cpp b/src/system/kernel/signal.cpp index a3fbfa13c8..db46be4d35 100644 --- a/src/system/kernel/signal.cpp +++ b/src/system/kernel/signal.cpp @@ -197,7 +197,7 @@ update_thread_signals_flag(struct thread* thread) } -static void +void update_current_thread_signals_flag() { InterruptsSpinLocker locker(thread_spinlock);