[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v7 1/3] xen: common: add ability to enable stack protector
On 18.03.2025 03:34, Volodymyr Babchuk wrote: > Both GCC and Clang support -fstack-protector feature, which add stack > canaries to functions where stack corruption is possible. This patch > makes general preparations to enable this feature on different > supported architectures: > > - Added CONFIG_HAS_STACK_PROTECTOR option so each architecture > can enable this feature individually > - Added user-selectable CONFIG_STACK_PROTECTOR option > - Implemented code that sets up random stack canary and a basic > handler for stack protector failures > > Stack guard value is initialized in two phases: > > 1. Pre-defined randomly-selected value. > > 2. Own implementation linear congruent random number generator. It > relies on get_cycles() being available very early. If get_cycles() > returns zero, it would leave pre-defined value from the previous > step. > > boot_stack_chk_guard_setup() is declared as inline, so it can be It's an always-inline function, and that is so important that it should be got right in the description as well. > --- /dev/null > +++ b/xen/common/stack-protector.c > @@ -0,0 +1,21 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +#include <xen/init.h> > +#include <xen/lib.h> > +#include <xen/random.h> > +#include <xen/time.h> > + > +/* > + * Initial value is chosen by a fair dice roll. > + * It will be updated during boot process. > + */ > +#if BITS_PER_LONG == 32 > +unsigned long __ro_after_init __stack_chk_guard = 0xdd2cc927UL; > +#else > +unsigned long __ro_after_init __stack_chk_guard = 0x2d853605a4d9a09cUL; > +#endif > + > +void asmlinkage __stack_chk_fail(void) The use of asmlinkage here comes close to an abuse: The Misra deviation is about C code called from assembly code only. This isn't the case here; instead it's a function that the compiler generates calls to without source code explicitly saying so. This imo wants approving from the Misra side as well, and even if approved likely requires a justifying code comment. > --- /dev/null > +++ b/xen/include/xen/stack-protector.h > @@ -0,0 +1,39 @@ > +#ifndef __XEN_STACK_PROTECTOR_H__ > +#define __XEN_STACK_PROTECTOR_H__ > + > +extern unsigned long __stack_chk_guard; > + > +/* > + * This function should be called from a C function that escapes stack > + * canary tracking (by calling reset_stack_and_jump() for example). > + */ > +static always_inline void boot_stack_chk_guard_setup(void) > +{ > +#ifdef CONFIG_STACK_PROTECTOR > + > + /* Nit: Hard tab slipped in. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |