mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
bpf, riscv: Fix extable handling for arena load_acquire
emit_atomic_ld_st() returns 1 to have build_body() skip the zext after
a sub-word load_acquire. The caller does "ret = ret ?:
add_exception_handler(...)", which skips add_exception_handler() on any
non-zero ret, so the extable entry is missing and a faulting
PROBE_ATOMIC load_acquire oopses.
REG_DONT_CLEAR_MARKER leaves rd stale on fault, and the verifier still
thinks the load overwrote it, so a program can leak it through a map.
Check ret >= 0 before calling add_exception_handler(), and pass rd for
LOAD_ACQ so the fault zeroes rd like a PROBE_MEM load. Return ret
unchanged for the zext skip.
Fixes: fb7cefabae ("riscv, bpf: Add support arena atomics for RV64")
Suggested-by: Pu Lehui <pulehui@huawei.com>
Signed-off-by: Feng Jiang <jiangfeng@kylinos.cn>
Reviewed-by: Pu Lehui <pulehui@huawei.com>
Reviewed-by: Björn Töpel <bjorn@kernel.org>
Acked-by: Björn Töpel <bjorn@kernel.org>
Link: https://lore.kernel.org/bpf/20260720-bpf-riscv-fix-extable-v4-1-165c0b3b07d5@kylinos.cn
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
This commit is contained in:
parent
2f2223a993
commit
5eb8921371
|
|
@ -1986,7 +1986,12 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
|
|||
else
|
||||
ret = emit_atomic_rmw(rd, rs, insn, ctx);
|
||||
|
||||
ret = ret ?: add_exception_handler(insn, REG_DONT_CLEAR_MARKER, ctx);
|
||||
/* ret can be 1 (skip-zext); extable entry still needs to be added */
|
||||
if (ret >= 0)
|
||||
ret = add_exception_handler(insn,
|
||||
insn->imm == BPF_LOAD_ACQ ? rd : REG_DONT_CLEAR_MARKER,
|
||||
ctx) ?: ret;
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
break;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user