]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bpf: Skip scalar adjustment for BPF_NEG if dst is a pointer
authorBrahmajit Das <listout@listout.xyz>
Wed, 1 Oct 2025 19:17:38 +0000 (00:47 +0530)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 1 Oct 2025 20:53:20 +0000 (13:53 -0700)
In check_alu_op(), the verifier currently calls check_reg_arg() and
adjust_scalar_min_max_vals() unconditionally for BPF_NEG operations.
However, if the destination register holds a pointer, these scalar
adjustments are unnecessary and potentially incorrect.

This patch adds a check to skip the adjustment logic when the destination
register contains a pointer.

Reported-by: syzbot+d36d5ae81e1b0a53ef58@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=d36d5ae81e1b0a53ef58
Fixes: aced132599b3 ("bpf: Add range tracking for BPF_NEG")
Suggested-by: KaFai Wan <kafai.wan@linux.dev>
Suggested-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Brahmajit Das <listout@listout.xyz>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20251001191739.2323644-2-listout@listout.xyz
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 73bba397672a9fc49a1b213e7b63a053e90b12f2..a5c52d53502a20a5de2c6f2e61bf351a3cfd9939 100644 (file)
@@ -15645,7 +15645,8 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
                }
 
                /* check dest operand */
-               if (opcode == BPF_NEG) {
+               if (opcode == BPF_NEG &&
+                   regs[insn->dst_reg].type == SCALAR_VALUE) {
                        err = check_reg_arg(env, insn->dst_reg, DST_OP_NO_MARK);
                        err = err ?: adjust_scalar_min_max_vals(env, insn,
                                                         &regs[insn->dst_reg],