Skip to content

Commit aefaa43

Browse files
Yonghong SongAlexei Starovoitov
authored andcommitted
bpf: Allow 'may_goto 0' instruction in verifier
Commit 011832b ("bpf: Introduce may_goto instruction") added support for may_goto insn. The 'may_goto 0' insn is disallowed since the insn is equivalent to a nop as both branch will go to the next insn. But it is possible that compiler transformation may generate 'may_goto 0' insn. Emil Tsalapatis from Meta reported such a case which caused verification failure. For example, for the following code, int i, tmp[3]; for (i = 0; i < 3 && can_loop; i++) tmp[i] = 0; ... clang 20 may generate code like may_goto 2; may_goto 1; may_goto 0; r1 = 0; /* tmp[0] = 0; */ r2 = 0; /* tmp[1] = 0; */ r3 = 0; /* tmp[2] = 0; */ Let us permit 'may_goto 0' insn to avoid verification failure for codes like the above. Reported-by: Emil Tsalapatis <etsal@meta.com> Acked-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Yonghong Song <yonghong.song@linux.dev> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/r/20250118192024.2124059-1-yonghong.song@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent d10cafc commit aefaa43

File tree

1 file changed

+2
-3
lines changed

1 file changed

+2
-3
lines changed

kernel/bpf/verifier.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15972,9 +15972,8 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env,
1597215972

1597315973
if (insn->code != (BPF_JMP | BPF_JCOND) ||
1597415974
insn->src_reg != BPF_MAY_GOTO ||
15975-
insn->dst_reg || insn->imm || insn->off == 0) {
15976-
verbose(env, "invalid may_goto off %d imm %d\n",
15977-
insn->off, insn->imm);
15975+
insn->dst_reg || insn->imm) {
15976+
verbose(env, "invalid may_goto imm %d\n", insn->imm);
1597815977
return -EINVAL;
1597915978
}
1598015979
prev_st = find_prev_entry(env, cur_st->parent, idx);

0 commit comments

Comments
 (0)