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