xref: /openbsd/regress/lib/libc/sigthr/sigthr_test.c (revision 3ba3a6ef)
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