mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-20 09:49:15 +03:00
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.
This commit is contained in:
parent
bd08664f05
commit
be4d33fb2c
Notes:
sideshowbarker
2024-07-19 12:57:57 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/be4d33fb2ce
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user