Commit 1ee4e350 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

powerpc: Skip stack validation checking alternate stacks if they are not allocated



Stack validation in early boot can just bail out of checking alternate
stacks if they are not validated yet. Checking against a NULL stack
could cause NULLish pointer values to be considered valid.

Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221216115930.2667772-5-npiggin@gmail.com
parent dc222fa7
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -2117,6 +2117,9 @@ static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
	unsigned long stack_page;
	unsigned long cpu = task_cpu(p);

	if (!hardirq_ctx[cpu] || !softirq_ctx[cpu])
		return 0;

	stack_page = (unsigned long)hardirq_ctx[cpu];
	if (sp >= stack_page && sp <= stack_page + THREAD_SIZE - nbytes)
		return 1;
@@ -2138,6 +2141,14 @@ static inline int valid_emergency_stack(unsigned long sp, struct task_struct *p,
	if (!paca_ptrs)
		return 0;

	if (!paca_ptrs[cpu]->emergency_sp)
		return 0;

# ifdef CONFIG_PPC_BOOK3S_64
	if (!paca_ptrs[cpu]->nmi_emergency_sp || !paca_ptrs[cpu]->mc_emergency_sp)
		return 0;
#endif

	stack_page = (unsigned long)paca_ptrs[cpu]->emergency_sp - THREAD_SIZE;
	if (sp >= stack_page && sp <= stack_page + THREAD_SIZE - nbytes)
		return 1;