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. Donenfeldstatic 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 Molnarstatic inline void boot_init_stack_canary(void) 3218aa8bb1SIngo Molnar { 3318aa8bb1SIngo Molnar } 349b5609fdSIngo Molnar #endif 359b5609fdSIngo Molnar 369b5609fdSIngo Molnar #endif 37