/* $OpenBSD: siginfo.c,v 1.11 2016/09/01 11:04:37 guenther Exp $ */ /* PUBLIC DOMAIN Oct 2002 */ /* * test SA_SIGINFO support. Also check that SA_RESETHAND does the right * thing. */ #include #include #include #include #include "test.h" #define BOGUS (char *)0x987230 static void act_handler(int signal, siginfo_t *siginfo, void *context) { struct sigaction sa; char * str; CHECKe(sigaction(SIGSEGV, NULL, &sa)); ASSERT(sa.sa_handler == SIG_DFL); ASSERT(siginfo != NULL); asprintf(&str, "act_handler: signal %d, siginfo %p, context %p\n" "addr %p, code %d, trap %d\n", signal, siginfo, context, siginfo->si_addr, siginfo->si_code, siginfo->si_trapno); write(STDOUT_FILENO, str, strlen(str)); free(str); ASSERT(siginfo->si_addr == BOGUS); ASSERT(siginfo->si_code == SEGV_MAPERR || siginfo->si_code == SEGV_ACCERR); SUCCEED; } int main(int argc, char **argv) { struct sigaction act; act.sa_sigaction = act_handler; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO | SA_RESETHAND | SA_NODEFER; CHECKe(sigaction(SIGSEGV, &act, NULL)); *BOGUS = 1; PANIC("How did we get here?"); }