1 /*
2  * Test that sigreturn() does not corrupt the signal mask.
3  * Block SIGUSR2 and handle SIGUSR1.
4  * Then sigwait() SIGUSR2, which relies on it remaining blocked.
5  *
6  * SPDX-License-Identifier: GPL-2.0-or-later
7  */
8 #include <assert.h>
9 #include <pthread.h>
10 #include <signal.h>
11 #include <stdlib.h>
12 #include <unistd.h>
13 
14 int seen_sig = -1;
15 
16 static void signal_func(int sig)
17 {
18     seen_sig = sig;
19 }
20 
21 static void *thread_func(void *arg)
22 {
23     kill(getpid(), SIGUSR2);
24     return NULL;
25 }
26 
27 int main(void)
28 {
29     struct sigaction act = {
30         .sa_handler = signal_func,
31     };
32     pthread_t thread;
33     sigset_t set;
34     int sig;
35 
36     assert(sigaction(SIGUSR1, &act, NULL) == 0);
37 
38     assert(sigemptyset(&set) == 0);
39     assert(sigaddset(&set, SIGUSR2) == 0);
40     assert(sigprocmask(SIG_BLOCK, &set, NULL) == 0);
41 
42     kill(getpid(), SIGUSR1);
43     assert(seen_sig == SIGUSR1);
44 
45     assert(pthread_create(&thread, NULL, thread_func, NULL) == 0);
46     assert(sigwait(&set, &sig) == 0);
47     assert(sig == SIGUSR2);
48     assert(pthread_join(thread, NULL) == 0);
49 
50     return EXIT_SUCCESS;
51 }
52