-
Couldn't load subscription status.
- Fork 145
bpf: Skip bounds adjustment for conditional jumps on same register #10092
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Upstream branch: e758657 |
ecdeefe to
10ce4bd
Compare
|
Upstream branch: ff88079 |
7c27a9a to
92a72ba
Compare
10ce4bd to
e5828a2
Compare
|
Upstream branch: f9db3a3 |
92a72ba to
2e7239e
Compare
e5828a2 to
13927c8
Compare
|
Upstream branch: 8842732 |
2e7239e to
db15a26
Compare
13927c8 to
9b73883
Compare
|
Upstream branch: 23f852d |
db15a26 to
36694be
Compare
9b73883 to
3cfe497
Compare
|
Upstream branch: 54c134f |
36694be to
5675981
Compare
3cfe497 to
6d6792d
Compare
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]>
|
Upstream branch: 9f317bd |
5675981 to
e3298af
Compare
|
At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=1015700 expired. Closing PR. |
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