Signal left blocked after signal handler.

From: Bruce Perens
Date: Wed Nov 26 2003 - 12:40:57 EST


Hi,

A signal should be blocked while its signal handler is executing, and
then unblocked when the handler returns - unless SA_NOMASK is set.

-test9 and -test10 leave the signal _blocked_forever_.

This causes the build-time confidence test for Electric Fence to break,
and no doubt lots of other code.

If SA_NOMASK is set, the signal is not blocked.

Test program attached below.

Thanks

Bruce

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>

static sigjmp_buf sjbuf;
static int sig = SIGINT;

static void
handler(int i)
{
struct sigaction act;

memset((void *)&act, 0, sizeof(act));
act.sa_handler = SIG_DFL;

fprintf(stderr, "Signal handler hit!\n");
fflush(stderr);
sigaction(sig, &act, 0);
siglongjmp(sjbuf, 1);

}

static void
invoke_signal()
{
struct sigaction act;

memset((void *)&act, 0, sizeof(act));
act.sa_handler = handler;

/* act.sa_flags = SA_NOMASK; */

if ( sigsetjmp(sjbuf, 0) == 0 ) {
sigaction(sig, &act, 0);
fprintf(stderr, "Sending signal... ");
fflush(stderr);
kill(getpid(), sig);
fprintf(stderr, "Huh? Nothing happened. Signal was left blocked.\n");
}
}

int
main(int argc, char * * argv)
{
sigset_t set;

sigemptyset(&set);
sigaddset(&set, sig);

invoke_signal();
invoke_signal();
fprintf(stderr, "Unblocking signal... ");
if ( sigsetjmp(sjbuf, 0) == 0 ) {
sigprocmask(SIG_UNBLOCK, &set, 0);
}

return 0;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/