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