change sigset_t functions to restrict to _NSIG
authorRich Felker <dalias@aerifal.cx>
Sat, 10 Aug 2013 01:25:29 +0000 (21:25 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 10 Aug 2013 01:25:29 +0000 (21:25 -0400)
the idea here is to avoid advertising signals that don't exist and to
make these functions safe to call (e.g. from within other parts of the
implementation) on fake sigset_t objects which do not have the HURD
padding.

src/signal/sigaddset.c
src/signal/sigdelset.c
src/signal/sigisemptyset.c
src/signal/sigismember.c

index edb48d1..085d1f4 100644 (file)
@@ -4,7 +4,7 @@
 int sigaddset(sigset_t *set, int sig)
 {
        unsigned s = sig-1;
-       if (s >= 8*sizeof(sigset_t) || sig-32U<3) {
+       if (s >= _NSIG-1 || sig-32U < 3) {
                errno = EINVAL;
                return -1;
        }
index a77c638..ce69280 100644 (file)
@@ -4,7 +4,7 @@
 int sigdelset(sigset_t *set, int sig)
 {
        unsigned s = sig-1;
-       if (s >= 8*sizeof(sigset_t) || sig-32U<3) {
+       if (s >= _NSIG-1 || sig-32U < 3) {
                errno = EINVAL;
                return -1;
        }
index e241051..312c66c 100644 (file)
@@ -4,6 +4,6 @@
 
 int sigisemptyset(const sigset_t *set)
 {
-       static const sigset_t zeroset;
-       return !memcmp(set, &zeroset, 8);
+       static const unsigned long zeroset[_NSIG/8/sizeof(long)];
+       return !memcmp(set, &zeroset, _NSIG/8);
 }
index 1a22108..dd1a8db 100644 (file)
@@ -4,6 +4,6 @@
 int sigismember(const sigset_t *set, int sig)
 {
        unsigned s = sig-1;
-       if (s >= 8*sizeof(sigset_t)) return 0;
+       if (s >= _NSIG-1) return 0;
        return !!(set->__bits[s/8/sizeof *set->__bits] & 1UL<<(s&8*sizeof *set->__bits-1));
 }