From bc2001bb3999da0cde5b83b5f448de628cdc5f08 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 22 Feb 2008 14:54:03 +0000 Subject: [PATCH] We have to update the pending signals thread flag when restoring the signal block mask when returning from a signal handler. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24064 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/ksignal.h | 2 ++ src/system/kernel/arch/x86/arch_thread.cpp | 5 +++++ src/system/kernel/signal.cpp | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) 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);