Quellcode durchsuchen

block signals in timer threads

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.
Rich Felker vor 13 Jahren
Ursprung
Commit
c516807173
1 geänderte Dateien mit 4 neuen und 0 gelöschten Zeilen
  1. 4 0
      src/time/timer_create.c

+ 4 - 0
src/time/timer_create.c

@@ -80,6 +80,7 @@ int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res)
 	struct start_args args;
 	struct start_args args;
 	struct ksigevent ksev, *ksevp=0;
 	struct ksigevent ksev, *ksevp=0;
 	int timerid;
 	int timerid;
+	sigset_t set;
 
 
 	switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
 	switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
 	case SIGEV_NONE:
 	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_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 		pthread_barrier_init(&args.b, 0, 2);
 		pthread_barrier_init(&args.b, 0, 2);
 		args.sev = evp;
 		args.sev = evp;
+		sigfillset(&set);
+		pthread_sigmask(SIG_BLOCK, &set, &set);
 		r = pthread_create(&td, &attr, start, &args);
 		r = pthread_create(&td, &attr, start, &args);
+		pthread_sigmask(SIG_SETMASK, &set, 0);
 		if (r) {
 		if (r) {
 			errno = r;
 			errno = r;
 			return -1;
 			return -1;