diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c index 64a9c093aef9..5eb2a204c05b 100644 --- a/arch/riscv/kernel/stacktrace.c +++ b/arch/riscv/kernel/stacktrace.c @@ -23,6 +23,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, { unsigned long fp, sp, pc; int level = 0; + int s = sizeof(struct stackframe); if (regs) { fp = frame_pointer(regs); @@ -50,7 +51,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs, /* Validate frame pointer */ low = sp + sizeof(struct stackframe); high = ALIGN(sp, THREAD_SIZE); - if (unlikely(fp < low || fp > high || fp & 0x7)) + if (unlikely(fp < low + s || fp > high - s || fp & 0x7)) break; /* Unwind stack frame */ frame = (struct stackframe *)fp - 1;