diff --git a/src/liblwevent/400_signalfd.c b/src/liblwevent/400_signalfd.c index 0c880e6..865d94d 100644 --- a/src/liblwevent/400_signalfd.c +++ b/src/liblwevent/400_signalfd.c @@ -95,7 +95,7 @@ lwevent_signalcb lwevent_signalfd_getcb(const struct lwevent_signal* si) int lwevent_signalfd_setsigs(struct lwevent_signal* si, const sigset_t* mask) { - sigset_t mnew; + sigset_t mnew, munmask, mmask; mnew = *mask; sigdelset(&mnew, SIGBUS); @@ -104,7 +104,12 @@ int lwevent_signalfd_setsigs(struct lwevent_signal* si, const sigset_t* mask) sigdelset(&mnew, SIGSEGV); if(TEMP_FAILURE_RETRY( signalfd(lwevent_get_fd(si->ev), &mnew) )) return -1; + + /* unmask old signals, mask new ones */ + TEMP_FAILURE_RETRY( sigprocmask(SIG_UNBLOCK, &si->mask) ); si->mask = mnew; + TEMP_FAILURE_RETRY( sigprocmask(SIG_BLOCK, &si->mask) ); + return 0; } @@ -121,6 +126,8 @@ void lwevent_signalfd_close(struct lwevent_signal* si) { if(!si) return; + TEMP_FAILURE_RETRY( sigprocmask(SIG_UNBLOCK, &si->mask) ); + lwevent_free(si->ev); free(si); }