1*b17f6c98Sclaudio /* $OpenBSD: siginfo.c,v 1.12 2024/08/29 15:16:43 claudio Exp $ */ 219eec2e2Smarc /* PUBLIC DOMAIN Oct 2002 <marc@snafu.org> */ 319eec2e2Smarc 48cda8cd1Smarc /* 58cda8cd1Smarc * test SA_SIGINFO support. Also check that SA_RESETHAND does the right 68cda8cd1Smarc * thing. 78cda8cd1Smarc */ 819eec2e2Smarc 919eec2e2Smarc #include <signal.h> 1019eec2e2Smarc #include <stdio.h> 11787c109eSmarc #include <unistd.h> 12db3296cfSderaadt #include <stdlib.h> 1319eec2e2Smarc 1419eec2e2Smarc #include "test.h" 1519eec2e2Smarc 16787c109eSmarc #define BOGUS (char *)0x987230 17787c109eSmarc 18db3296cfSderaadt static void 1919eec2e2Smarc act_handler(int signal, siginfo_t *siginfo, void *context) 2019eec2e2Smarc { 21477a56a0Smarc struct sigaction sa; 22477a56a0Smarc 23477a56a0Smarc CHECKe(sigaction(SIGSEGV, NULL, &sa)); 24477a56a0Smarc ASSERT(sa.sa_handler == SIG_DFL); 253987246bSmarc ASSERT(siginfo != NULL); 26*b17f6c98Sclaudio dprintf(STDOUT_FILENO, "act_handler: signal %d, siginfo %p, " 27*b17f6c98Sclaudio "context %p\naddr %p, code %d, trap %d\n", signal, siginfo, 28*b17f6c98Sclaudio context, siginfo->si_addr, siginfo->si_code, 29*b17f6c98Sclaudio siginfo->si_trapno); 3024208248Smarc ASSERT(siginfo->si_addr == BOGUS); 3193deff90Sguenther ASSERT(siginfo->si_code == SEGV_MAPERR || 3293deff90Sguenther siginfo->si_code == SEGV_ACCERR); 33787c109eSmarc SUCCEED; 3419eec2e2Smarc } 3519eec2e2Smarc 3619eec2e2Smarc int 3719eec2e2Smarc main(int argc, char **argv) 3819eec2e2Smarc { 3919eec2e2Smarc struct sigaction act; 4019eec2e2Smarc 4119eec2e2Smarc act.sa_sigaction = act_handler; 4219eec2e2Smarc sigemptyset(&act.sa_mask); 43787c109eSmarc act.sa_flags = SA_SIGINFO | SA_RESETHAND | SA_NODEFER; 4419eec2e2Smarc CHECKe(sigaction(SIGSEGV, &act, NULL)); 45787c109eSmarc *BOGUS = 1; 46787c109eSmarc PANIC("How did we get here?"); 4719eec2e2Smarc } 48