Re: [PATCH v8 5/6] x86/signal: Detect and prevent an alternate signal stack overflow
From: Bae, Chang Seok <hidden>
Date: 2021-05-18 20:53:26
Also in:
linux-api, lkml
On Apr 22, 2021, at 15:04, David Laight [off-list ref] wrote:
From: Bae, Chang Seok Sent: 22 April 2021 17:31quoted
On Apr 22, 2021, at 01:46, David Laight [off-list ref] wrote:quoted
From: Chang S. Bae Sent: 22 April 2021 05:49quoted
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.The difference is on the SS_AUTODISARM flag check. This refactoring was suggested as on_sig_stack() brought confusion [3].I was just confused by the #ifdef. Whether %sp points to the last item or the next space is actually independent of the stack direction. A stack might usually use pre-decrement and post-increment but it doesn't have to. The stack pointer can't be right at one end of the alt-stack area (because that is the address you'd use when you switch to it), and if you are any where near the other end you are hosed. So a common test: return (unsigned long)(sp - current->sas_ss_sp) < current->sas_ss_size; will always work. It isn't as though the stack pointer should be anywhere else other than the 'real' thread stack.
Thanks for the suggestion. Yes, this hunk can be made better like that. But I would make this change as pure refactoring. Perhaps, follow up after this series. Chang