1 /* $OpenBSD: sigaltstack_fork.c,v 1.2 2011/11/26 04:11:34 guenther Exp $ */
2
3 /*
4 * Public domain. 2011, Joshua Elsasser
5 *
6 * Test if child processes inherit an alternate signal stack.
7 */
8
9 #include <sys/types.h>
10 #include <sys/wait.h>
11
12 #include <err.h>
13 #include <signal.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <unistd.h>
17
18 void
check_stack(void * buf,const char * label)19 check_stack(void *buf, const char *label)
20 {
21 struct sigaltstack ss;
22
23 bzero(&ss, sizeof(ss));
24 if (sigaltstack(NULL, &ss) != 0)
25 err(1, "failed to get sigaltstack in %s", label);
26 if (ss.ss_sp != buf ||
27 ss.ss_size != SIGSTKSZ ||
28 ss.ss_flags != 0)
29 errx(1, "bad sigaltstack value in %s: "
30 "buf=%p ss_sp=%p ss_size=%zu ss_flags=0x%x",
31 label, buf, ss.ss_sp, ss.ss_size, ss.ss_flags);
32 }
33
34 int
main(int argc,char * argv[])35 main(int argc, char *argv[])
36 {
37 struct sigaltstack ss;
38 int status;
39 pid_t kid;
40 void *buf;
41
42 if ((buf = malloc(SIGSTKSZ)) == NULL)
43 err(1, "malloc failed");
44
45 bzero(&ss, sizeof(ss));
46 ss.ss_sp = buf;
47 ss.ss_size = SIGSTKSZ;
48 if (sigaltstack(&ss, NULL) != 0)
49 err(1, "failed to set sigaltstack");
50
51 check_stack(buf, "parent");
52
53 if ((kid = fork()) == -1)
54 err(1, "fork failed");
55
56 if (kid == 0) {
57 check_stack(buf, "child");
58 _exit(0);
59 }
60
61 if (waitpid(kid, &status, 0) != kid)
62 err(1, "waitpid failed");
63 if (!WIFEXITED(status))
64 errx(1, "child did not exit normally");
65
66 return (WEXITSTATUS(status));
67 }
68