From: Chang S. Bae > Sent: 22 April 2021 05:49 > > The kernel pushes context on to the userspace stack to prepare for the > user's signal handler. When the user has supplied an alternate signal > stack, via sigaltstack(2), it is easy for the kernel to verify that the > stack size is sufficient for the current hardware context. > > Check if writing the hardware context to the alternate stack will exceed > it's size. If yes, then instead of corrupting user-data and proceeding with > the original signal handler, an immediate SIGSEGV signal is delivered. What happens if SIGSEGV is caught? > Refactor the stack pointer check code from on_sig_stack() and use the new > helper. > > While the kernel allows new source code to discover and use a sufficient > alternate signal stack size, this check is still necessary to protect > binaries with insufficient alternate signal stack size from data > corruption. ... > diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h > index 3f6a0fcaa10c..ae60f838ebb9 100644 > --- a/include/linux/sched/signal.h > +++ b/include/linux/sched/signal.h > @@ -537,6 +537,17 @@ static inline int kill_cad_pid(int sig, int priv) > #define SEND_SIG_NOINFO ((struct kernel_siginfo *) 0) > #define SEND_SIG_PRIV ((struct kernel_siginfo *) 1) > > +static inline int __on_sig_stack(unsigned long sp) > +{ > +#ifdef CONFIG_STACK_GROWSUP > + return sp >= current->sas_ss_sp && > + sp - current->sas_ss_sp < current->sas_ss_size; > +#else > + return sp > current->sas_ss_sp && > + sp - current->sas_ss_sp <= current->sas_ss_size; > +#endif > +} > + Those don't look different enough. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)