-
Notifications
You must be signed in to change notification settings - Fork 5
bpf: Skip bounds adjustment for conditional jumps on same register #6213
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
bpf: Skip bounds adjustment for conditional jumps on same register #6213
Conversation
|
Upstream branch: e758657 |
4d1f3ab to
7ba9a34
Compare
|
Upstream branch: ff88079 |
b2a444d to
a09339d
Compare
7ba9a34 to
2991dd5
Compare
|
Upstream branch: f9db3a3 |
a09339d to
6085525
Compare
2991dd5 to
583dec7
Compare
|
Upstream branch: 8842732 |
6085525 to
44bee73
Compare
583dec7 to
e224139
Compare
|
Upstream branch: 23f852d |
44bee73 to
33e8f7c
Compare
e224139 to
1f11231
Compare
|
Upstream branch: 54c134f |
33e8f7c to
b1ba975
Compare
1f11231 to
2563a04
Compare
|
Upstream branch: 9f317bd |
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]>
b1ba975 to
da72e9d
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