| From ecc9bccbd70ef9fc103e55719787d3c9d9b8f4d5 Mon Sep 17 00:00:00 2001 |
| From: Wei Li <liwei391@huawei.com> |
| Date: Mon, 1 Apr 2019 11:55:57 +0800 |
| Subject: arm64: fix wrong check of on_sdei_stack in nmi context |
| |
| [ Upstream commit 1c41860864c8ae0387ef7d44f0000e99cbb2e06d ] |
| |
| When doing unwind_frame() in the context of pseudo nmi (need enable |
| CONFIG_ARM64_PSEUDO_NMI), reaching the bottom of the stack (fp == 0, |
| pc != 0), function on_sdei_stack() will return true while the sdei acpi |
| table is not inited in fact. This will cause a "NULL pointer dereference" |
| oops when going on. |
| |
| Reviewed-by: Julien Thierry <julien.thierry@arm.com> |
| Signed-off-by: Wei Li <liwei391@huawei.com> |
| Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> |
| Signed-off-by: Sasha Levin (Microsoft) <sashal@kernel.org> |
| --- |
| arch/arm64/kernel/sdei.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| diff --git a/arch/arm64/kernel/sdei.c b/arch/arm64/kernel/sdei.c |
| index 5ba4465e44f0..ea94cf8f9dc6 100644 |
| --- a/arch/arm64/kernel/sdei.c |
| +++ b/arch/arm64/kernel/sdei.c |
| @@ -94,6 +94,9 @@ static bool on_sdei_normal_stack(unsigned long sp, struct stack_info *info) |
| unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_normal_ptr); |
| unsigned long high = low + SDEI_STACK_SIZE; |
| |
| + if (!low) |
| + return false; |
| + |
| if (sp < low || sp >= high) |
| return false; |
| |
| @@ -111,6 +114,9 @@ static bool on_sdei_critical_stack(unsigned long sp, struct stack_info *info) |
| unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_critical_ptr); |
| unsigned long high = low + SDEI_STACK_SIZE; |
| |
| + if (!low) |
| + return false; |
| + |
| if (sp < low || sp >= high) |
| return false; |
| |
| -- |
| 2.20.1 |
| |