From ab0a3a02c44522e11b56b28c3c97ec7870d16de1 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Sat, 23 Jun 2012 05:54:50 +0000 Subject: add (currently failing) stackjmp regress test --- regress/sys/kern/stackjmp/Makefile | 5 ++++ regress/sys/kern/stackjmp/stackjmp.c | 54 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 regress/sys/kern/stackjmp/Makefile create mode 100644 regress/sys/kern/stackjmp/stackjmp.c (limited to 'regress/sys') diff --git a/regress/sys/kern/stackjmp/Makefile b/regress/sys/kern/stackjmp/Makefile new file mode 100644 index 00000000000..a67ea8fdecc --- /dev/null +++ b/regress/sys/kern/stackjmp/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1 2012/06/23 05:54:49 matthew Exp $ + +PROG= stackjmp + +.include diff --git a/regress/sys/kern/stackjmp/stackjmp.c b/regress/sys/kern/stackjmp/stackjmp.c new file mode 100644 index 00000000000..aa73c2d97a0 --- /dev/null +++ b/regress/sys/kern/stackjmp/stackjmp.c @@ -0,0 +1,54 @@ +/* $OpenBSD: stackjmp.c,v 1.1 2012/06/23 05:54:49 matthew Exp $ */ +#include +#include +#include +#include +#include + +static jmp_buf jb; +static char buf[SIGSTKSZ]; +static volatile int handled; + +static int +isaltstack() +{ + stack_t os; + assert(sigaltstack(NULL, &os) == 0); + return (os.ss_flags & SS_ONSTACK) != 0; +} + +static void +inthandler(int signo) +{ + assert(isaltstack()); + handled = 1; + siglongjmp(jb, 1); +} + +int +main() +{ + struct sigaction sa; + stack_t stack; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = inthandler; + sa.sa_flags = SA_ONSTACK; + assert(sigaction(SIGINT, &sa, NULL) == 0); + + memset(&stack, 0, sizeof(stack)); + stack.ss_sp = buf; + stack.ss_size = sizeof(buf); + stack.ss_flags = 0; + assert(sigaltstack(&stack, NULL) == 0); + + assert(!isaltstack()); + sigsetjmp(jb, 1); + assert(!isaltstack()); + if (!handled) { + kill(getpid(), SIGINT); + assert(0); /* Shouldn't reach here. */ + } + + return (0); +} -- cgit v1.2.3