1 /* Test that the stack correctly dies after a setcontext(2) call. */ 2 3 #include <assert.h> 4 #include <signal.h> 5 #include <stdio.h> 6 #include <ucontext.h> 7 8 static volatile int *sp; 9 10 static void sighandler(int sig, siginfo_t *sip, void *arg) 11 { 12 ucontext_t *ucp = (ucontext_t *) arg; 13 sp = (int *) &ucp->uc_mcontext.gregs[0]; 14 } 15 16 int main(void) 17 { 18 struct sigaction sa; 19 /* Always-null value that is used to prevent any possible compiler 20 optimizations. */ 21 volatile int zero = 0; 22 23 /* Setup a signal handler. */ 24 sa.sa_sigaction = sighandler; 25 sa.sa_flags = SA_SIGINFO; 26 if (sigfillset(&sa.sa_mask)) { 27 perror("sigfillset"); 28 return 1; 29 } 30 if (sigaction(SIGUSR1, &sa, NULL)) { 31 perror("sigaction"); 32 return 1; 33 } 34 35 /* Raise a signal. */ 36 raise(SIGUSR1); 37 38 /* Value pointed by sp should be at this point uninitialized. */ 39 if (*sp && zero) 40 assert(0); 41 42 return 0; 43 } 44 45