summaryrefslogtreecommitdiffstats
path: root/regress/sys/kern/signal/sigaltstack_fork/sigaltstack_fork.c
diff options
context:
space:
mode:
authorjoshe <joshe@openbsd.org>2011-11-22 23:06:48 +0000
committerjoshe <joshe@openbsd.org>2011-11-22 23:06:48 +0000
commita30d92924c28f1a63b3f1d348f5e9647ca98ba2d (patch)
treea99b7bee5efc6e0b326dc35c3ce4f6cb68760140 /regress/sys/kern/signal/sigaltstack_fork/sigaltstack_fork.c
parentsigstack() is long dead, and the compat sigaltstack syscall is gone too. (diff)
downloadwireguard-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.c67
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));
+}