Skip to content

Commit

Permalink
stackprotector: better self-test
Browse files Browse the repository at this point in the history
check stackprotector functionality by manipulating the canary briefly
during bootup.

far more robust than trying to overflow the stack. (which is architecture
dependent, etc.)

Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Arjan van de Ven authored and Ingo Molnar committed Jul 11, 2008
1 parent 5ce001b commit aa92db1
Showing 1 changed file with 5 additions and 8 deletions.
13 changes: 5 additions & 8 deletions kernel/panic.c
Original file line number Diff line number Diff line change
Expand Up @@ -347,22 +347,18 @@ static noinline void __stack_chk_test_func(void)
if ((unsigned long)__builtin_return_address(0) ==
*(((unsigned long *)&foo)+1)) {
printk(KERN_ERR "No -fstack-protector-stack-frame!\n");
return;
}
#ifdef CONFIG_FRAME_POINTER
/* We also don't want to clobber the frame pointer */
if ((unsigned long)__builtin_return_address(0) ==
*(((unsigned long *)&foo)+2)) {
printk(KERN_ERR "No -fstack-protector-stack-frame!\n");
return;
}
#endif
barrier();
if (current->stack_canary == *(((unsigned long *)&foo)+1))
*(((unsigned long *)&foo)+1) = 0;
else
if (current->stack_canary != *(((unsigned long *)&foo)+1))
printk(KERN_ERR "No -fstack-protector canary found\n");
barrier();

current->stack_canary = ~current->stack_canary;
}

static int __stack_chk_test(void)
Expand All @@ -373,7 +369,8 @@ static int __stack_chk_test(void)
if (__stack_check_testing) {
printk(KERN_ERR "-fstack-protector-all test failed\n");
WARN_ON(1);
}
};
current->stack_canary = ~current->stack_canary;
return 0;
}
/*
Expand Down

0 comments on commit aa92db1

Please sign in to comment.