mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:27:35 +00: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
2 changed files with 10 additions and 10 deletions
|
@ -204,7 +204,7 @@ void Thread::send_signal(u8 signal, Process* sender)
|
||||||
else
|
else
|
||||||
dbgprintf("signal: kernel sent %d to %s(%u)\n", signal, process().name().characters(), pid());
|
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
|
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;
|
u32 signal_candidates = m_pending_signals & ~m_signal_mask;
|
||||||
ASSERT(signal_candidates);
|
ASSERT(signal_candidates);
|
||||||
|
|
||||||
u8 signal = 0;
|
u8 signal = 1;
|
||||||
for (; signal < 32; ++signal) {
|
for (; signal < 32; ++signal) {
|
||||||
if (signal_candidates & (1 << signal)) {
|
if (signal_candidates & (1 << (signal - 1))) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -294,7 +294,7 @@ bool Thread::should_ignore_signal(u8 signal) const
|
||||||
ShouldUnblockThread Thread::dispatch_signal(u8 signal)
|
ShouldUnblockThread Thread::dispatch_signal(u8 signal)
|
||||||
{
|
{
|
||||||
ASSERT_INTERRUPTS_DISABLED();
|
ASSERT_INTERRUPTS_DISABLED();
|
||||||
ASSERT(signal < 32);
|
ASSERT(signal > 0 && signal <= 32);
|
||||||
|
|
||||||
#ifdef SIGNAL_DEBUG
|
#ifdef SIGNAL_DEBUG
|
||||||
kprintf("dispatch_signal %s(%u) <- %u\n", process().name().characters(), pid(), signal);
|
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));
|
ASSERT(!(action.flags & SA_SIGINFO));
|
||||||
|
|
||||||
// Mark this signal as handled.
|
// Mark this signal as handled.
|
||||||
m_pending_signals &= ~(1 << signal);
|
m_pending_signals &= ~(1 << (signal - 1));
|
||||||
|
|
||||||
if (signal == SIGSTOP) {
|
if (signal == SIGSTOP) {
|
||||||
set_state(Stopped);
|
set_state(Stopped);
|
||||||
|
@ -348,9 +348,9 @@ ShouldUnblockThread Thread::dispatch_signal(u8 signal)
|
||||||
u32 old_signal_mask = m_signal_mask;
|
u32 old_signal_mask = m_signal_mask;
|
||||||
u32 new_signal_mask = action.mask;
|
u32 new_signal_mask = action.mask;
|
||||||
if (action.flags & SA_NODEFER)
|
if (action.flags & SA_NODEFER)
|
||||||
new_signal_mask &= ~(1 << signal);
|
new_signal_mask &= ~(1 << (signal - 1));
|
||||||
else
|
else
|
||||||
new_signal_mask |= 1 << signal;
|
new_signal_mask |= 1 << (signal - 1);
|
||||||
|
|
||||||
m_signal_mask |= new_signal_mask;
|
m_signal_mask |= new_signal_mask;
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ int sigaddset(sigset_t* set, int sig)
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*set |= 1 << (sig);
|
*set |= 1 << (sig - 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ int sigdelset(sigset_t* set, int sig)
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
*set &= ~(1 << (sig));
|
*set &= ~(1 << (sig - 1));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ int sigismember(const sigset_t* set, int sig)
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (*set & (1 << (sig)))
|
if (*set & (1 << (sig - 1)))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue