xref: /linux/include/linux/stackprotector.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
29b5609fdSIngo Molnar #ifndef _LINUX_STACKPROTECTOR_H
39b5609fdSIngo Molnar #define _LINUX_STACKPROTECTOR_H 1
49b5609fdSIngo Molnar 
542059429SIngo Molnar #include <linux/compiler.h>
642059429SIngo Molnar #include <linux/sched.h>
742059429SIngo Molnar #include <linux/random.h>
842059429SIngo Molnar 
9*b3883a9aSJason A. Donenfeld /*
10*b3883a9aSJason A. Donenfeld  * On 64-bit architectures, protect against non-terminated C string overflows
11*b3883a9aSJason A. Donenfeld  * by zeroing out the first byte of the canary; this leaves 56 bits of entropy.
12*b3883a9aSJason A. Donenfeld  */
13*b3883a9aSJason A. Donenfeld #ifdef CONFIG_64BIT
14*b3883a9aSJason A. Donenfeld # ifdef __LITTLE_ENDIAN
15*b3883a9aSJason A. Donenfeld #  define CANARY_MASK 0xffffffffffffff00UL
16*b3883a9aSJason A. Donenfeld # else /* big endian, 64 bits: */
17*b3883a9aSJason A. Donenfeld #  define CANARY_MASK 0x00ffffffffffffffUL
18*b3883a9aSJason A. Donenfeld # endif
19*b3883a9aSJason A. Donenfeld #else /* 32 bits: */
20*b3883a9aSJason A. Donenfeld # define CANARY_MASK 0xffffffffUL
21*b3883a9aSJason A. Donenfeld #endif
22*b3883a9aSJason A. Donenfeld 
get_random_canary(void)23*b3883a9aSJason A. Donenfeld static inline unsigned long get_random_canary(void)
24*b3883a9aSJason A. Donenfeld {
25*b3883a9aSJason A. Donenfeld 	return get_random_long() & CANARY_MASK;
26*b3883a9aSJason A. Donenfeld }
27*b3883a9aSJason A. Donenfeld 
2828321582SAmit Daniel Kachhap #if defined(CONFIG_STACKPROTECTOR) || defined(CONFIG_ARM64_PTR_AUTH)
299b5609fdSIngo Molnar # include <asm/stackprotector.h>
3018aa8bb1SIngo Molnar #else
boot_init_stack_canary(void)3118aa8bb1SIngo Molnar static inline void boot_init_stack_canary(void)
3218aa8bb1SIngo Molnar {
3318aa8bb1SIngo Molnar }
349b5609fdSIngo Molnar #endif
359b5609fdSIngo Molnar 
369b5609fdSIngo Molnar #endif
37