Branch data Line data Source code
1 : : /*
2 : : * GCC stack protector support.
3 : : *
4 : : * Stack protector works by putting predefined pattern at the start of
5 : : * the stack frame and verifying that it hasn't been overwritten when
6 : : * returning from the function. The pattern is called stack canary
7 : : * and gcc expects it to be defined by a global variable called
8 : : * "__stack_chk_guard" on ARM. This unfortunately means that on SMP
9 : : * we cannot have a different canary value per task.
10 : : */
11 : :
12 : : #ifndef _ASM_STACKPROTECTOR_H
13 : : #define _ASM_STACKPROTECTOR_H 1
14 : :
15 : : #include <linux/random.h>
16 : : #include <linux/version.h>
17 : :
18 : : extern unsigned long __stack_chk_guard;
19 : :
20 : : /*
21 : : * Initialize the stackprotector canary value.
22 : : *
23 : : * NOTE: this must only be called from functions that never return,
24 : : * and it must always be inlined.
25 : : */
26 : : static __always_inline void boot_init_stack_canary(void)
27 : : {
28 : : unsigned long canary;
29 : :
30 : : /* Try to get a semi random initial value. */
31 : 0 : get_random_bytes(&canary, sizeof(canary));
32 : 0 : canary ^= LINUX_VERSION_CODE;
33 : :
34 : 0 : current->stack_canary = canary;
35 : 0 : __stack_chk_guard = current->stack_canary;
36 : : }
37 : :
38 : : #endif /* _ASM_STACKPROTECTOR_H */
|