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