root/misc/stack.c

Revision 13, 1.7 kB (checked in by haypo, 1 year ago)

cleanup stack.c

  • Property svn:eol-style set to native
Line 
1 /**
2  * Example of code to catch SIGSEGV exception on
3  * stack overflow. Allow to execute code whereas
4  * the stack is full.
5  *
6  * Author: Victor Stinner
7  * Creation date: 2007-04-23
8  */
9
10 #include <setjmp.h>
11 #include <signal.h>
12 #include <stdlib.h>
13 #include <stdio.h>        /* printf() */
14 #include <sys/ucontext.h> /* ucontext_t */
15
16 jmp_buf env;                      /* try/except */
17 char alternate_stack[10*4096];    /* signal handler stack content */
18
19 /* SIGSEGV signal handler */
20 void handler(int signum)
21 {
22     longjmp(env, 1);
23 }
24
25 /* create stack overflow */
26 void overflow(int i) {
27     int r[256];
28     if (i % 8 == 0) {
29         printf("%p ", &r);
30         if (i % 64 == 0) {
31             printf("\n");
32         }
33         fflush(stdout);
34     }
35     overflow(i+1);
36 }
37
38 /* setup our signal stack */
39 void init_signal_stack()
40 {
41   stack_t ss ;     /* signal handler stack */
42   ss.ss_sp    = alternate_stack;
43   ss.ss_size  = sizeof(alternate_stack);
44   ss.ss_flags = 0;
45   if( sigaltstack(&ss, NULL)) {
46     /* error */
47     fprintf(stderr, "Failed sigaltstack\n" );
48     exit(1);
49   }
50 }
51
52 /* setup our signal handler (for SIGSEGV) */
53 void init_signal_handler()
54 {
55     struct sigaction newAct;
56     sigemptyset(&newAct.sa_mask);
57     sigaddset(&newAct.sa_mask, SIGSEGV);
58     newAct.sa_handler = handler;
59     newAct.sa_flags     = SA_RESETHAND | SA_RESTART | SA_ONSTACK;
60     if( sigaction( SIGSEGV, &newAct, NULL ) == -1 ){
61         /* error */
62         fprintf(stderr, "Failed to set my signal handler.\n" );
63         exit(1);
64     }
65 }
66
67 void code()
68 {
69     if (!setjmp(env)) {
70         overflow(1);
71     } else {
72         /* SIGSEGV catched */
73         printf("sigsegv\n");
74     }
75     printf("continue execution!\n");
76 }
77
78 int main()
79 {
80     init_signal_stack();
81     init_signal_handler();
82     code();
83     exit(0);
84 }
85
Note: See TracBrowser for help on using the browser.