You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
riscv: entry: set a0 = -ENOSYS only when syscall != -1
When we test seccomp with 6.4 kernel, we found errno has wrong value.
If we deny NETLINK_AUDIT with EAFNOSUPPORT, after f0bddf5, we will
get ENOSYS instead. We got same result with commit 9c2598d ("riscv:
entry: Save a0 prior syscall_enter_from_user_mode()").
After analysing code, we think that regs->a0 = -ENOSYS should only be
executed when syscall != -1. In __seccomp_filter, when seccomp rejected
this syscall with specified errno, they will set a0 to return number as
syscall ABI, and then return -1. This return number is finally pass as
return number of syscall_enter_from_user_mode, and then is compared with
NR_syscalls after converted to ulong (so it will be ULONG_MAX). The
condition syscall < NR_syscalls will always be false, so regs->a0 = -ENOSYS
is always executed. It covered a0 set by seccomp, so we always get
ENOSYS when match seccomp RET_ERRNO rule.
Fixes: f0bddf5 ("riscv: entry: Convert to generic entry")
Reported-by: Felix Yan <[email protected]>
Co-developed-by: Ruizhe Pan <[email protected]>
Signed-off-by: Ruizhe Pan <[email protected]>
Co-developed-by: Shiqi Zhang <[email protected]>
Signed-off-by: Shiqi Zhang <[email protected]>
Signed-off-by: Celeste Liu <[email protected]>
Tested-by: Felix Yan <[email protected]>
Tested-by: Emil Renner Berthing <[email protected]>
Reviewed-by: Björn Töpel <[email protected]>
Reviewed-by: Guo Ren <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Palmer Dabbelt <[email protected]>
0 commit comments