From be4d33fb2ce53563601107a6c3a891fc3aab5039 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 1 Aug 2019 11:00:36 +0200 Subject: [PATCH] Kernel+LibC: A lot of the signal handling code was off-by-one. There is no signal 0. The valid ones are 1 (SIGHUP) through 31 (SIGSYS) Found by PVS-Studio. --- Kernel/Thread.cpp | 14 +++++++------- Libraries/LibC/signal.cpp | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index e2370135e0..af93bbbb95 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -204,7 +204,7 @@ void Thread::send_signal(u8 signal, Process* sender) else dbgprintf("signal: kernel sent %d to %s(%u)\n", signal, process().name().characters(), pid()); - m_pending_signals |= 1 << signal; + m_pending_signals |= 1 << (signal - 1); } bool Thread::has_unmasked_pending_signals() const @@ -218,9 +218,9 @@ ShouldUnblockThread Thread::dispatch_one_pending_signal() u32 signal_candidates = m_pending_signals & ~m_signal_mask; ASSERT(signal_candidates); - u8 signal = 0; + u8 signal = 1; for (; signal < 32; ++signal) { - if (signal_candidates & (1 << signal)) { + if (signal_candidates & (1 << (signal - 1))) { break; } } @@ -294,7 +294,7 @@ bool Thread::should_ignore_signal(u8 signal) const ShouldUnblockThread Thread::dispatch_signal(u8 signal) { ASSERT_INTERRUPTS_DISABLED(); - ASSERT(signal < 32); + ASSERT(signal > 0 && signal <= 32); #ifdef SIGNAL_DEBUG kprintf("dispatch_signal %s(%u) <- %u\n", process().name().characters(), pid(), signal); @@ -305,7 +305,7 @@ ShouldUnblockThread Thread::dispatch_signal(u8 signal) ASSERT(!(action.flags & SA_SIGINFO)); // Mark this signal as handled. - m_pending_signals &= ~(1 << signal); + m_pending_signals &= ~(1 << (signal - 1)); if (signal == SIGSTOP) { set_state(Stopped); @@ -348,9 +348,9 @@ ShouldUnblockThread Thread::dispatch_signal(u8 signal) u32 old_signal_mask = m_signal_mask; u32 new_signal_mask = action.mask; if (action.flags & SA_NODEFER) - new_signal_mask &= ~(1 << signal); + new_signal_mask &= ~(1 << (signal - 1)); else - new_signal_mask |= 1 << signal; + new_signal_mask |= 1 << (signal - 1); m_signal_mask |= new_signal_mask; diff --git a/Libraries/LibC/signal.cpp b/Libraries/LibC/signal.cpp index 59ad5fa1f6..6fcc02bad8 100644 --- a/Libraries/LibC/signal.cpp +++ b/Libraries/LibC/signal.cpp @@ -63,7 +63,7 @@ int sigaddset(sigset_t* set, int sig) errno = EINVAL; return -1; } - *set |= 1 << (sig); + *set |= 1 << (sig - 1); return 0; } @@ -73,7 +73,7 @@ int sigdelset(sigset_t* set, int sig) errno = EINVAL; return -1; } - *set &= ~(1 << (sig)); + *set &= ~(1 << (sig - 1)); return 0; } @@ -83,7 +83,7 @@ int sigismember(const sigset_t* set, int sig) errno = EINVAL; return -1; } - if (*set & (1 << (sig))) + if (*set & (1 << (sig - 1))) return 1; return 0; }