3 # sigaltstack(2) regression test by Steven Hartland <killing@multiplay.co.uk>
4 # Wrong altsigstack clearing on exec
5 # https://github.com/golang/go/issues/15658#issuecomment-287276856
10 cat > test-sigs.c <<EOF
20 extern char **environ;
30 setstack(void *arg __unused)
34 ss.ss_sp = malloc(SIGSTKSZ);
38 ss.ss_size = SIGSTKSZ;
40 if (sigaltstack(&ss, NULL) < 0)
41 die("sigaltstack set");
45 thread_exec(void *arg)
47 struct timespec ts = {0, 1000};
48 char *argv[] = {"./test-sigs", "no-more", 0};
53 execve(argv[0], &argv[0], environ);
60 thread_sleep(void *arg __unused)
68 main(int argc, char** argv __unused)
76 if (sigaltstack(NULL, &ss) < 0)
77 die("sigaltstack get");
79 if (ss.ss_sp != NULL || ss.ss_flags != SS_DISABLE ||
81 fprintf(stderr, "invalid signal stack after execve: "
82 "ss_sp=%p ss_size=%lu ss_flags=0x%x\n", ss.ss_sp,
83 (unsigned long)ss.ss_size,
84 (unsigned int)ss.ss_flags);
88 printf("valid signal stack is valid after execve\n");
93 // We have to use two threads to ensure that can detect the
94 // issue when new threads are added to the head (pre 269095)
95 // and the tail of the process thread list.
96 j = pthread_create(&tid1, NULL, thread_exec, NULL);
99 die("pthread_create");
102 j = pthread_create(&tid2, NULL, thread_sleep, NULL);
105 die("pthread_create");
108 j = pthread_join(tid1, NULL);
114 j = pthread_join(tid2, NULL);
123 cc -o test-sigs -Wall -Wextra -O2 -g test-sigs.c -lpthread || exit 1
127 rm -f test-sigs test-sigs.c