riscv, mm: Perform BPF exhandler fixup on page fault
authorBjörn Töpel <bjorn@rivosinc.com>
Tue, 14 Feb 2023 16:25:15 +0000 (17:25 +0100)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 22 Feb 2023 01:21:39 +0000 (17:21 -0800)
Commit 21855cac82d3 ("riscv/mm: Prevent kernel module to access user
memory without uaccess routines") added early exits/deaths for page
faults stemming from accesses to user-space without using proper
uaccess routines (where sstatus.SUM is set).

Unfortunatly, this is too strict for some BPF programs, which relies
on BPF exhandler fixups. These BPF programs loads "BTF pointers". A
BTF pointers could either be a valid kernel pointer or NULL, but not a
userspace address.

Resolve the problem by calling the fixup handler in the early exit
path.

Fixes: 21855cac82d3 ("riscv/mm: Prevent kernel module to access user memory without uaccess routines")
Signed-off-by: Björn Töpel <bjorn@rivosinc.com>
Link: https://lore.kernel.org/r/20230214162515.184827-1-bjorn@kernel.org
Cc: stable@vger.kernel.org
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/mm/fault.c

index d86f7cebd4a7ef3799089cbbbbe61f1a1b099605..eb0774d9c03b1539254adbe3e692c63c2e850ab6 100644 (file)
@@ -267,10 +267,12 @@ asmlinkage void do_page_fault(struct pt_regs *regs)
        if (user_mode(regs))
                flags |= FAULT_FLAG_USER;
 
-       if (!user_mode(regs) && addr < TASK_SIZE &&
-                       unlikely(!(regs->status & SR_SUM)))
-               die_kernel_fault("access to user memory without uaccess routines",
-                               addr, regs);
+       if (!user_mode(regs) && addr < TASK_SIZE && unlikely(!(regs->status & SR_SUM))) {
+               if (fixup_exception(regs))
+                       return;
+
+               die_kernel_fault("access to user memory without uaccess routines", addr, regs);
+       }
 
        perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr);