blob: ad7329f63b90f6fd9fbd51dd79a6c9c0dfa365e0 [file] [log] [blame]
Jeff Browned07e002011-02-03 17:46:23 -08001#include <assert.h>
2#include <setjmp.h>
3#include <signal.h>
4#include <stdio.h>
5#include <stdlib.h>
6
7// Regression test for bug 91162: if a client had a SEGV signal handler,
8// and jumped to a bogus address, Valgrind would abort. With the fix,
9// the following test runs to completion correctly.
10
11static jmp_buf myjmpbuf;
12
13static
14void SIGSEGV_handler(int signum)
15{
Ben Cheng663860b2013-01-31 15:38:14 -080016 longjmp(myjmpbuf, 1);
Jeff Browned07e002011-02-03 17:46:23 -080017}
18
19int main(void)
20{
21 struct sigaction sigsegv_new, sigsegv_saved;
22 int res;
23
24 /* Install own SIGSEGV handler */
25 sigsegv_new.sa_handler = SIGSEGV_handler;
26 sigsegv_new.sa_flags = 0;
Evgeniy Stepanovb32f5802011-12-20 11:21:56 +040027#if !defined(__APPLE__)
Jeff Browned07e002011-02-03 17:46:23 -080028 sigsegv_new.sa_restorer = NULL;
29#endif
30 res = sigemptyset( &sigsegv_new.sa_mask );
31 assert(res == 0);
32
33 res = sigaction( SIGSEGV, &sigsegv_new, &sigsegv_saved );
34 assert(res == 0);
35
Ben Cheng663860b2013-01-31 15:38:14 -080036 if (setjmp(myjmpbuf) == 0) {
Jeff Browned07e002011-02-03 17:46:23 -080037 // Jump to zero; will cause seg fault
Evgeniy Stepanovb32f5802011-12-20 11:21:56 +040038#if defined(__powerpc64__)
39 unsigned long int fn[3];
40 fn[0] = 0;
41 fn[1] = 0;
42 fn[2] = 0;
Jeff Browned07e002011-02-03 17:46:23 -080043#else
44 void (*fn)(void) = 0;
Jeff Browned07e002011-02-03 17:46:23 -080045#endif
Evgeniy Stepanovb32f5802011-12-20 11:21:56 +040046 ((void(*)(void)) fn) ();
Jeff Browned07e002011-02-03 17:46:23 -080047 fprintf(stderr, "Got here??\n");
48 } else {
49 fprintf(stderr, "Signal caught, as expected\n");
50 }
51
52 return 0;
53}
54