/* Test that the stack correctly dies after a setcontext(2) call. */ #include <assert.h> #include <signal.h> #include <stdio.h> #include <ucontext.h> static volatile int *sp; static void sighandler(int sig, siginfo_t *sip, ucontext_t *ucp) { sp = (int *) &ucp->uc_mcontext.gregs[0]; } int main(void) { struct sigaction sa; /* Always-null value that is used to prevent any possible compiler optimizations. */ volatile int zero = 0; /* Setup a signal handler. */ sa.sa_handler = sighandler; sa.sa_flags = SA_SIGINFO; if (sigfillset(&sa.sa_mask)) { perror("sigfillset"); return 1; } if (sigaction(SIGUSR1, &sa, NULL)) { perror("sigaction"); return 1; } /* Raise a signal. */ raise(SIGUSR1); /* Value pointed by sp should be at this point uninitialized. */ if (*sp && zero) assert(0); return 0; }