diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index a5ec747..80a19fb 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -622,7 +622,7 @@ sig_ffs(sigset_t *set) for (i = 0; i < _SIG_WORDS; i++) if (set->__bits[i]) - return (ffs(set->__bits[i]) + (i * 32)); + return (fls(set->__bits[i]) + (i * 32)); return (0); } diff --git a/sys/sys/signalvar.h b/sys/sys/signalvar.h index f7fcaa9..73f4998 100644 --- a/sys/sys/signalvar.h +++ b/sys/sys/signalvar.h @@ -108,7 +108,13 @@ typedef void __osiginfohandler_t(int, osiginfo_t *, void *); * sigset_t manipulation macros. */ #define SIGADDSET(set, signo) \ - ((set).__bits[_SIG_WORD(signo)] |= _SIG_BIT(signo)) + do { \ + if ((set).__bits[_SIG_WORD(signo)] == ~0U) { \ + ((set).__bits[_SIG_WORD(signo)] = _SIG_BIT(signo)); \ + } else { \ + ((set).__bits[_SIG_WORD(signo)] |= _SIG_BIT(signo)); \ + } \ + } while (0) #define SIGDELSET(set, signo) \ ((set).__bits[_SIG_WORD(signo)] &= ~_SIG_BIT(signo))