diff mbox series

arm64: mm: kfence: only handle translation faults

Message ID 20221114104411.2853040-1-mark.rutland@arm.com (mailing list archive)
State New, archived
Headers show
Series arm64: mm: kfence: only handle translation faults | expand

Commit Message

Mark Rutland Nov. 14, 2022, 10:44 a.m. UTC
Alexander noted that KFENCE only expects to handle faults from invalid page
table entries (i.e. translation faults), but arm64's fault handling logic will
call kfence_handle_page_fault() for other types of faults, including alignment
faults caused by unaligned atomics. This has the unfortunate property of
causing those other faults to be reported as "KFENCE: use-after-free",
which is misleading and hinders debugging.

Fix this by only forwarding unhandled translation faults to the KFENCE
code, similar to what x86 does already.

Alexander has verified that this passes all the tests in the KFENCE test
suite and avoids bogus reports on misaligned atomics.

Link: https://lore.kernel.org/all/20221102081620.1465154-1-zhongbaisong@huawei.com/
Fixes: 840b239863449f27 ("arm64, kfence: enable KFENCE for ARM6")
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Alexander Potapenko <glider@google.com>
Tested-by: Alexander Potapenko <glider@google.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Marco Elver <elver@google.com>
Cc: Will Deacon <will@kernel.org>
---
 arch/arm64/mm/fault.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Will Deacon Nov. 15, 2022, 6:32 p.m. UTC | #1
On Mon, 14 Nov 2022 10:44:11 +0000, Mark Rutland wrote:
> Alexander noted that KFENCE only expects to handle faults from invalid page
> table entries (i.e. translation faults), but arm64's fault handling logic will
> call kfence_handle_page_fault() for other types of faults, including alignment
> faults caused by unaligned atomics. This has the unfortunate property of
> causing those other faults to be reported as "KFENCE: use-after-free",
> which is misleading and hinders debugging.
> 
> [...]

Applied to arm64 (for-next/mm), thanks!

[1/1] arm64: mm: kfence: only handle translation faults
      https://git.kernel.org/arm64/c/0bb1fbffc631

Cheers,
diff mbox series

Patch

diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 3e9cf9826417a..3eb2825d08cff 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -354,6 +354,11 @@  static bool is_el1_mte_sync_tag_check_fault(unsigned long esr)
 	return false;
 }
 
+static bool is_translation_fault(unsigned long esr)
+{
+	return (esr & ESR_ELx_FSC_TYPE) == ESR_ELx_FSC_FAULT;
+}
+
 static void __do_kernel_fault(unsigned long addr, unsigned long esr,
 			      struct pt_regs *regs)
 {
@@ -386,7 +391,8 @@  static void __do_kernel_fault(unsigned long addr, unsigned long esr,
 	} else if (addr < PAGE_SIZE) {
 		msg = "NULL pointer dereference";
 	} else {
-		if (kfence_handle_page_fault(addr, esr & ESR_ELx_WNR, regs))
+		if (is_translation_fault(esr) &&
+		    kfence_handle_page_fault(addr, esr & ESR_ELx_WNR, regs))
 			return;
 
 		msg = "paging request";