Commit a8ea7ee
bpf: Skip bounds adjustment for conditional jumps on same register
When conditional jumps are performed on the same register (e.g., r0 <= r0,
r0 > r0, r0 < r0) where the register holds a scalar with range, the verifier
incorrectly attempts to adjust the register's min/max bounds. This leads to
invalid range bounds and triggers a BUG warning:
verifier bug: REG INVARIANTS VIOLATION (true_reg1): range bounds violation u64=[0x1, 0x0] s64=[0x1, 0x0] u32=[0x1, 0x0] s32=[0x1, 0x0] var_off=(0x0, 0x0)
WARNING: CPU: 0 PID: 92 at kernel/bpf/verifier.c:2731 reg_bounds_sanity_check+0x163/0x220
Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
RIP: 0010:reg_bounds_sanity_check+0x163/0x220
Call Trace:
<TASK>
reg_set_min_max+0xf7/0x1d0
check_cond_jmp_op+0x57b/0x1730
? print_bpf_insn+0x3d5/0xa50
do_check_common+0x33ac/0x33c0
...
The root cause is in regs_refine_cond_op() where BPF_JLT/BPF_JSLT operations
adjust both min/max bounds on the same register, causing invalid bounds.
Since comparing a register with itself should not change its bounds (the
comparison result is always known: r0 == r0 is always true, r0 < r0 is
always false), the bounds adjustment is unnecessary.
Fix this by:
1. Enhance is_branch_taken() and is_scalar_branch_taken() to properly
handle branch direction computation for same register comparisons
across all BPF jump operations
2. For unknown branch directions (e.g., BPF_JSET), add early return in
reg_set_min_max() to avoid bounds adjustment on the same register
The fix ensures that unnecessary bounds adjustments are skipped, preventing
the verifier bug while maintaining correct branch direction analysis.
Reported-by: Kaiyan Mei <[email protected]>
Reported-by: Yinhao Hu <[email protected]>
Closes: https://lore.kernel.org/all/[email protected]/
Fixes: 0df1a55 ("bpf: Warn on internal verifier errors")
Signed-off-by: KaFai Wan <[email protected]>1 parent 4d1f3ab commit a8ea7ee
1 file changed
+32
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16037 | 16037 | | |
16038 | 16038 | | |
16039 | 16039 | | |
| 16040 | + | |
| 16041 | + | |
| 16042 | + | |
| 16043 | + | |
| 16044 | + | |
| 16045 | + | |
16040 | 16046 | | |
16041 | 16047 | | |
16042 | 16048 | | |
| |||
16172 | 16178 | | |
16173 | 16179 | | |
16174 | 16180 | | |
| 16181 | + | |
| 16182 | + | |
| 16183 | + | |
| 16184 | + | |
| 16185 | + | |
| 16186 | + | |
| 16187 | + | |
| 16188 | + | |
| 16189 | + | |
| 16190 | + | |
| 16191 | + | |
| 16192 | + | |
| 16193 | + | |
| 16194 | + | |
| 16195 | + | |
| 16196 | + | |
| 16197 | + | |
| 16198 | + | |
| 16199 | + | |
16175 | 16200 | | |
16176 | 16201 | | |
16177 | 16202 | | |
| |||
16429 | 16454 | | |
16430 | 16455 | | |
16431 | 16456 | | |
| 16457 | + | |
| 16458 | + | |
| 16459 | + | |
| 16460 | + | |
| 16461 | + | |
| 16462 | + | |
| 16463 | + | |
16432 | 16464 | | |
16433 | 16465 | | |
16434 | 16466 | | |
| |||
0 commit comments