1*3ba3a6efSguenther /*
2*3ba3a6efSguenther * Copyright (c) 2015 Philip Guenther <guenther@openbsd.org>
3*3ba3a6efSguenther *
4*3ba3a6efSguenther * Public domain.
5*3ba3a6efSguenther *
6*3ba3a6efSguenther * Verify that SIGTHR can't be blocked or caught by applications.
7*3ba3a6efSguenther */
8*3ba3a6efSguenther
9*3ba3a6efSguenther #include <err.h>
10*3ba3a6efSguenther #include <errno.h>
11*3ba3a6efSguenther #include <stdio.h>
12*3ba3a6efSguenther #include <stdlib.h>
13*3ba3a6efSguenther #include <string.h>
14*3ba3a6efSguenther #include <signal.h>
15*3ba3a6efSguenther
sighandler(int sig)16*3ba3a6efSguenther void sighandler(int sig) { }
17*3ba3a6efSguenther
18*3ba3a6efSguenther int
main(void)19*3ba3a6efSguenther main(void)
20*3ba3a6efSguenther {
21*3ba3a6efSguenther struct sigaction sa;
22*3ba3a6efSguenther sigset_t set, oset;
23*3ba3a6efSguenther
24*3ba3a6efSguenther /*
25*3ba3a6efSguenther * check sigprocmask
26*3ba3a6efSguenther */
27*3ba3a6efSguenther if (sigprocmask(SIG_BLOCK, NULL, &set))
28*3ba3a6efSguenther err(1, "sigprocmask");
29*3ba3a6efSguenther if (sigismember(&set, SIGTHR))
30*3ba3a6efSguenther errx(1, "SIGTHR already blocked");
31*3ba3a6efSguenther sigaddset(&set, SIGTHR);
32*3ba3a6efSguenther if (sigprocmask(SIG_BLOCK, &set, NULL))
33*3ba3a6efSguenther err(1, "sigprocmask");
34*3ba3a6efSguenther if (sigprocmask(SIG_SETMASK, &set, &oset))
35*3ba3a6efSguenther err(1, "sigprocmask");
36*3ba3a6efSguenther if (sigismember(&oset, SIGTHR))
37*3ba3a6efSguenther errx(1, "SIGTHR blocked with SIG_BLOCK");
38*3ba3a6efSguenther if (sigprocmask(SIG_BLOCK, NULL, &oset))
39*3ba3a6efSguenther err(1, "sigprocmask");
40*3ba3a6efSguenther if (sigismember(&oset, SIGTHR))
41*3ba3a6efSguenther errx(1, "SIGTHR blocked with SIG_SETMASK");
42*3ba3a6efSguenther
43*3ba3a6efSguenther /*
44*3ba3a6efSguenther * check sigaction
45*3ba3a6efSguenther */
46*3ba3a6efSguenther if (sigaction(SIGTHR, NULL, &sa) == 0)
47*3ba3a6efSguenther errx(1, "sigaction(SIGTHR) succeeded");
48*3ba3a6efSguenther else if (errno != EINVAL)
49*3ba3a6efSguenther err(1, "sigaction(SIGTHR) didn't fail with EINVAL");
50*3ba3a6efSguenther memset(&sa, 0, sizeof sa);
51*3ba3a6efSguenther sa.sa_handler = sighandler;
52*3ba3a6efSguenther sigfillset(&sa.sa_mask);
53*3ba3a6efSguenther sa.sa_flags = 0;
54*3ba3a6efSguenther if (sigaction(SIGTHR, &sa, NULL) == 0)
55*3ba3a6efSguenther errx(1, "sigaction(SIGTHR) succeeded");
56*3ba3a6efSguenther else if (errno != EINVAL)
57*3ba3a6efSguenther err(1, "sigaction(SIGTHR) didn't fail with EINVAL");
58*3ba3a6efSguenther if (sigaction(SIGUSR1, &sa, NULL))
59*3ba3a6efSguenther err(1, "sigaction(SIGUSR1)");
60*3ba3a6efSguenther if (sigaction(SIGUSR1, NULL, &sa))
61*3ba3a6efSguenther err(1, "sigaction(SIGUSR1)");
62*3ba3a6efSguenther if (sigismember(&sa.sa_mask, SIGTHR))
63*3ba3a6efSguenther errx(1, "SIGTHR blocked with sigaction");
64*3ba3a6efSguenther
65*3ba3a6efSguenther return 0;
66*3ba3a6efSguenther }
67