Skip to content

Conversation

@kernel-patches-daemon-bpf
Copy link

Pull request for series with
subject: bpf: Skip bounds adjustment for conditional jumps on same register
version: 2
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=1015700

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]>
Add a test to verify that conditional jumps using the BPF_JGT opcode on
the same register (e.g., "if r0 > r0") do not trigger verifier BUG
warnings when the register contains a scalar value with range information.

Signed-off-by: KaFai Wan <[email protected]>
@kernel-patches-daemon-bpf
Copy link
Author

Upstream branch: e758657
series: https://patchwork.kernel.org/project/netdevbpf/list/?series=1015700
version: 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant