block signals in timer threads
authorRich Felker <dalias@aerifal.cx>
Thu, 11 Aug 2011 19:54:06 +0000 (15:54 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 11 Aug 2011 19:54:06 +0000 (15:54 -0400)
if a timer thread leaves signals unblocked, any future attempt by the
main thread to prevent the process from being terminated by blocking
signals will fail, since the signal can still be delivered to the
timer thread.

src/time/timer_create.c

index 1561d797a258608e131fe2753e74b61cfca81ab8..593f73aa5f4a88a12a16c2516f72b26e44645559 100644 (file)
@@ -80,6 +80,7 @@ int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res)
        struct start_args args;
        struct ksigevent ksev, *ksevp=0;
        int timerid;
+       sigset_t set;
 
        switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
        case SIGEV_NONE:
@@ -104,7 +105,10 @@ int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res)
                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
                pthread_barrier_init(&args.b, 0, 2);
                args.sev = evp;
+               sigfillset(&set);
+               pthread_sigmask(SIG_BLOCK, &set, &set);
                r = pthread_create(&td, &attr, start, &args);
+               pthread_sigmask(SIG_SETMASK, &set, 0);
                if (r) {
                        errno = r;
                        return -1;