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 |
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 --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";