| 1 |
|
| 2 | #ifndef _LINUX_STACKPROTECTOR_H
|
| 3 | #define _LINUX_STACKPROTECTOR_H 1
|
| 4 |
|
| 5 | #include <linux/compiler.h>
|
| 6 | #include <linux/sched.h>
|
| 7 | #include <linux/random.h>
|
| 8 |
|
| 9 | |
| 10 | * On 64-bit architectures, protect against non-terminated C string overflows
|
| 11 | * by zeroing out the first byte of the canary; this leaves 56 bits of entropy.
|
| 12 |
|
| 13 | #ifdef CONFIG_64BIT
|
| 14 | # ifdef __LITTLE_ENDIAN
|
| 15 | # define CANARY_MASK 0xffffffffffffff00UL
|
| 16 | # else
|
| 17 | # define CANARY_MASK 0x00ffffffffffffffUL
|
| 18 | # endif
|
| 19 | #else
|
| 20 | # define CANARY_MASK 0xffffffffUL
|
| 21 | #endif
|
| 22 |
|
| 23 | static inline unsigned long get_random_canary(void)
|
| 24 | {
|
| 25 | return get_random_long() & CANARY_MASK;
|
| 26 | }
|
| 27 |
|
| 28 | #if defined(CONFIG_STACKPROTECTOR) || defined(CONFIG_ARM64_PTR_AUTH)
|
| 29 | # include <asm/stackprotector.h>
|
| 30 | #else
|
| 31 | static inline void boot_init_stack_canary(void)
|
| 32 | {
|
| 33 | }
|
| 34 | #endif
|
| 35 |
|
| 36 | #endif
|