diff --git a/kernel-src/include/kernel/signal.h b/kernel-src/include/kernel/signal.h index a6465099..126eeaa4 100644 --- a/kernel-src/include/kernel/signal.h +++ b/kernel-src/include/kernel/signal.h @@ -14,9 +14,9 @@ typedef struct { uint64_t sig[1024 / 64]; } sigset_t; -#define SIGNAL_GET(sigset, signal) ((sigset)->sig[(signal) / 64] & (1lu << ((signal) % 64))) -#define SIGNAL_SETON(sigset, signal) (sigset)->sig[(signal) / 64] |= (1lu << ((signal) % 64)) -#define SIGNAL_SETOFF(sigset, signal) (sigset)->sig[(signal) / 64] &= ~(1lu << ((signal) % 64)) +#define SIGNAL_GET(sigset, signal) ((sigset)->sig[((signal) - 1) / 64] & (1lu << (((signal) - 1) % 64))) +#define SIGNAL_SETON(sigset, signal) (sigset)->sig[((signal) - 1) / 64] |= (1lu << (((signal) - 1) % 64)) +#define SIGNAL_SETOFF(sigset, signal) (sigset)->sig[((signal) - 1) / 64] &= ~(1lu << (((signal) - 1) % 64)) #define SIG_DFL ((void *)(0)) #define SIG_IGN ((void *)(1)) diff --git a/kernel-src/sys/scheduler.c b/kernel-src/sys/scheduler.c index 19cfcf54..1d3e4353 100644 --- a/kernel-src/sys/scheduler.c +++ b/kernel-src/sys/scheduler.c @@ -64,7 +64,7 @@ int sched_signalall(int signal, proc_t *sender) { pid_t currentpgid = jobctl_getpgid(current); - if (senderpgid == 0 || (signal == SIGCONT && currentpgid == senderpgid) || auth_process_check(&sender->cred, AUTH_ACTIONS_PROCESS_SIGNAL, current)) { + if (senderpgid == 0 || (signal == SIGCONT && currentpgid == senderpgid) || auth_process_check(&sender->cred, AUTH_ACTIONS_PROCESS_SIGNAL, current) == 0) { ++donecount; signal_signalproc(current, signal); } diff --git a/kernel-src/sys/signal.c b/kernel-src/sys/signal.c index ceb37e39..7a692777 100644 --- a/kernel-src/sys/signal.c +++ b/kernel-src/sys/signal.c @@ -96,7 +96,7 @@ void signal_changemask(struct thread_t *thread, int how, sigset_t *new, sigset_t switch (how) { case SIG_BLOCK: case SIG_UNBLOCK: { - for (int i = 0; i < NSIG; ++i) { + for (int i = 1; i < NSIG; ++i) { if (SIGNAL_GET(new, i) == 0) continue; @@ -127,7 +127,7 @@ void signal_pending(struct thread_t *thread, sigset_t *sigset) { // urgent set doesn't get returned here as it will always be handled // before a return to userspace memset(sigset, 0, sizeof(sigset_t)); - for (int i = 0; i < NSIG; ++i) { + for (int i = 1; i < NSIG; ++i) { if (SIGNAL_GET(&proc->signals.pending, i)) SIGNAL_SETON(sigset, i); @@ -275,7 +275,7 @@ bool signal_check(struct thread_t *thread, context_t *context, bool syscall, uin sigset_t *sigset = NULL; // check the urgent sigset first - for (int i = 0; i < NSIG; ++i) { + for (int i = 1; i < NSIG; ++i) { if (SIGNAL_GET(&thread->signals.urgent, i) == 0) continue; @@ -283,7 +283,7 @@ bool signal_check(struct thread_t *thread, context_t *context, bool syscall, uin sigset = &thread->signals.urgent; } - for (int i = 0; i < NSIG && sigset == NULL; ++i) { + for (int i = 1; i < NSIG && sigset == NULL; ++i) { if (SIGNAL_GET(&thread->signals.mask, i)) continue; @@ -397,7 +397,7 @@ bool signal_check(struct thread_t *thread, context_t *context, bool syscall, uin if ((action->flags & SA_NODEFER) == 0) SIGNAL_SETON(&thread->signals.mask, signal); - for (int i = 0; i < signal; ++i) { + for (int i = 1; i < signal; ++i) { if (SIGNAL_GET(&action->mask, i) == 0) continue; diff --git a/kernel-src/sys/syscalls/kill.c b/kernel-src/sys/syscalls/kill.c index c722895d..751d3abf 100644 --- a/kernel-src/sys/syscalls/kill.c +++ b/kernel-src/sys/syscalls/kill.c @@ -31,7 +31,7 @@ syscallret_t syscall_kill(context_t *context, int pid, int signal) { goto leave; if (pid >= 1) { - if (signal != SIGCONT && jobctl_getpgid(target) != jobctl_getpgid(_cpu()->thread->proc)) { + if (signal != SIGCONT || jobctl_getpgid(target) != jobctl_getpgid(_cpu()->thread->proc)) { ret.errno = auth_process_check(&_cpu()->thread->proc->cred, AUTH_ACTIONS_PROCESS_SIGNAL, target); if (ret.errno) goto leave;