forked from ValveSoftware/steamos_kernel
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64 currently lacks support for -fstack-protector. Add similar functionality to arm to detect stack corruption. Acked-by: Will Deacon <will.deacon@arm.com> Acked-by: Kees Cook <keescook@chromium.org> Signed-off-by: Laura Abbott <lauraa@codeaurora.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
- Loading branch information
Showing
3 changed files
with
45 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/* | ||
* GCC stack protector support. | ||
* | ||
* Stack protector works by putting predefined pattern at the start of | ||
* the stack frame and verifying that it hasn't been overwritten when | ||
* returning from the function. The pattern is called stack canary | ||
* and gcc expects it to be defined by a global variable called | ||
* "__stack_chk_guard" on ARM. This unfortunately means that on SMP | ||
* we cannot have a different canary value per task. | ||
*/ | ||
|
||
#ifndef __ASM_STACKPROTECTOR_H | ||
#define __ASM_STACKPROTECTOR_H | ||
|
||
#include <linux/random.h> | ||
#include <linux/version.h> | ||
|
||
extern unsigned long __stack_chk_guard; | ||
|
||
/* | ||
* Initialize the stackprotector canary value. | ||
* | ||
* NOTE: this must only be called from functions that never return, | ||
* and it must always be inlined. | ||
*/ | ||
static __always_inline void boot_init_stack_canary(void) | ||
{ | ||
unsigned long canary; | ||
|
||
/* Try to get a semi random initial value. */ | ||
get_random_bytes(&canary, sizeof(canary)); | ||
canary ^= LINUX_VERSION_CODE; | ||
|
||
current->stack_canary = canary; | ||
__stack_chk_guard = current->stack_canary; | ||
} | ||
|
||
#endif /* _ASM_STACKPROTECTOR_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters