diff --git a/lib/tevent/tevent_signal.c b/lib/tevent/tevent_signal.c index 4a58a8b..fdbe96a 100644 --- a/lib/tevent/tevent_signal.c +++ b/lib/tevent/tevent_signal.c @@ -304,24 +304,12 @@ int tevent_common_check_signal(struct tevent_context *ev) #ifdef SA_SIGINFO if (se->sa_flags & SA_SIGINFO) { int j; + /* count can never be > SA_INFO_QUEUE_COUNT */ for (j=0;jhandler(ev, se, i, 1, - (void*)&sig_state->sig_info[i][ofs], + se->handler(ev, se, i, 1, + (void*)&sig_state->sig_info[i][j], se->private_data); } - if (SIG_PENDING(sig_state->sig_blocked[i])) { - /* we'd filled the queue, unblock the - signal now */ - sigset_t set; - sigemptyset(&set); - sigaddset(&set, i); - SIG_SEEN(sig_state->sig_blocked[i], - sig_count(sig_state->sig_blocked[i])); - sigprocmask(SIG_UNBLOCK, &set, NULL); - } if (se->sa_flags & SA_RESETHAND) { talloc_free(se); } @@ -335,6 +323,19 @@ int tevent_common_check_signal(struct tevent_context *ev) } SIG_SEEN(sig_state->signal_count[i], count); SIG_SEEN(sig_state->got_signal, count); + +#ifdef SA_SIGINFO + if (SIG_PENDING(sig_state->sig_blocked[i])) { + /* we'd filled the queue, unblock the + signal now the queue is empty again */ + sigset_t set; + sigemptyset(&set); + sigaddset(&set, i); + SIG_SEEN(sig_state->sig_blocked[i], + sig_count(sig_state->sig_blocked[i])); + sigprocmask(SIG_UNBLOCK, &set, NULL); + } +#endif } return 1;