diff options
author | 2011-11-22 23:06:48 +0000 | |
---|---|---|
committer | 2011-11-22 23:06:48 +0000 | |
commit | a30d92924c28f1a63b3f1d348f5e9647ca98ba2d (patch) | |
tree | a99b7bee5efc6e0b326dc35c3ce4f6cb68760140 /regress/sys/kern/signal/sigaltstack_fork/sigaltstack_fork.c | |
parent | sigstack() is long dead, and the compat sigaltstack syscall is gone too. (diff) | |
download | wireguard-openbsd-a30d92924c28f1a63b3f1d348f5e9647ca98ba2d.tar.xz wireguard-openbsd-a30d92924c28f1a63b3f1d348f5e9647ca98ba2d.zip |
Add a test for forked processes inheriting their parent's signal stack.
ok guenther@
Diffstat (limited to 'regress/sys/kern/signal/sigaltstack_fork/sigaltstack_fork.c')
-rw-r--r-- | regress/sys/kern/signal/sigaltstack_fork/sigaltstack_fork.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/regress/sys/kern/signal/sigaltstack_fork/sigaltstack_fork.c b/regress/sys/kern/signal/sigaltstack_fork/sigaltstack_fork.c new file mode 100644 index 00000000000..8b6237bdf9b --- /dev/null +++ b/regress/sys/kern/signal/sigaltstack_fork/sigaltstack_fork.c @@ -0,0 +1,67 @@ +/* $OpenBSD: sigaltstack_fork.c,v 1.1 2011/11/22 23:06:49 joshe Exp $ */ + +/* + * Public domain. 2011, Joshua Elsasser + * + * Test if child processes inherit an alternate signal stack. + */ + +#include <sys/types.h> +#include <sys/wait.h> + +#include <err.h> +#include <signal.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +void +check_stack(void *buf, const char *label) +{ + struct sigaltstack ss; + + bzero(&ss, sizeof(ss)); + if (sigaltstack(NULL, &ss) != 0) + err(1, "failed to get sigaltstack in parent"); + if (ss.ss_sp != buf || + ss.ss_size != SIGSTKSZ || + ss.ss_flags != 0) + errx(1, "bad sigaltstack value in %s: " + "buf=%p ss_sp=%p ss_size=%zu ss_flags=0x%x", + label, buf, ss.ss_sp, ss.ss_size, ss.ss_flags); +} + +int +main(int argc, char *argv[]) +{ + struct sigaltstack ss; + int status; + pid_t kid; + void *buf; + + if ((buf = malloc(SIGSTKSZ)) == NULL) + err(1, "malloc failed"); + + bzero(&ss, sizeof(ss)); + ss.ss_sp = buf; + ss.ss_size = SIGSTKSZ; + if (sigaltstack(&ss, NULL) != 0) + err(1, "failed to set sigaltstack"); + + check_stack(buf, "parent"); + + if ((kid = fork()) == -1) + err(1, "fork failed"); + + if (kid == 0) { + check_stack(buf, "child"); + _exit(0); + } + + if (waitpid(kid, &status, 0) != kid) + err(1, "waitpid failed"); + if (!WIFEXITED(status)) + errx(1, "child did not exit normally"); + + return (WEXITSTATUS(status)); +} |