...
Code Block | ||
---|---|---|
| ||
jmp_buf buf;
unsigned char b[] = {0xe5, 0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00};
int main(void) {
setup();
do_stuff();
return 0;
}
void setup(void) {
f();
}
void f(void) {
g();
}
void g(void) {
if (setjmp(buf) == 0) {
printf("setjmp() invoked\n");
} else {
printf("longjmp() invoked\n");
}
}
void do_stuff(void) {
char a[8];
memcpy(a, b, 8);
/* ... stuff ... */
longjmp(buf, 1);
}
void bad(void) {
printf("Should not be called!\n");
exit(1);
}
|
...
Code Block | ||
---|---|---|
| ||
jmp_buf buf;
unsigned char b[] = {0xe5, 0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00};
int main(void) {
if (setjmp(buf) == 0) {
printf("setjmp() invoked\n");
} else {
printf("longjmp() invoked\n");
}
do_stuff();
return 0;
}
void do_stuff(void) {
char a[8];
memcpy(a, b, 8);
/* ... stuff ... */
longjmp(buf, 1);
}
void bad(void) {
printf("Should not be called!\n");
exit(1);
}
|
In this example compliant solution, there is no risk of overwriting a return address because the stackframe stack frame of main()
(the function that invoked setjmp()
) is still on the stack, so when do_stuff()
is invoked, the two stackframes stack frames will not overlap.
Noncompliant Code Example
...