-
Notifications
You must be signed in to change notification settings - Fork 5
bpf: Skip bounds adjustment for conditional jumps on same register #6201
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 #6201
Conversation
|
Upstream branch: e758657 |
e698de7 to
ee5122f
Compare
|
Upstream branch: e758657 |
a1b5da8 to
4a90d07
Compare
ee5122f to
d5592b9
Compare
|
Upstream branch: e758657 |
4a90d07 to
afaa027
Compare
d5592b9 to
27d6d8b
Compare
|
Upstream branch: e758657 |
afaa027 to
2f3fcb1
Compare
27d6d8b to
4d1f3ab
Compare
|
Upstream branch: e758657 |
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: 93 at kernel/bpf/verifier.c:2731 reg_bounds_sanity_check+0x163/0x220 Modules linked in: CPU: 0 UID: 0 PID: 93 Comm: repro-x-3 Tainted: G W 6.18.0-rc1-ge7586577b75f-dirty #218 PREEMPT(full) Tainted: [W]=WARN 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.part.0+0x1b1/0x360 check_cond_jmp_op+0x1195/0x1a60 do_check_common+0x33ac/0x33c0 ... The issue occurs in reg_set_min_max() function where bounds adjustment logic is applied even when both registers being compared are the same. Comparing a register with itself should not change its bounds since the comparison result is always known (e.g., r0 == r0 is always true, r0 < r0 is always false). Fix this by adding an early return in reg_set_min_max() when false_reg1 and false_reg2 point to the same register, skipping the unnecessary bounds adjustment that leads to the verifier bug. 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 case to verify that conditional jumps on the same register (e.g., JGT r0 > r0) do not trigger verifier BUG warnings when the register holds a scalar with range. Signed-off-by: KaFai Wan <[email protected]>
2f3fcb1 to
3a8e847
Compare
Pull request for series with
subject: bpf: Skip bounds adjustment for conditional jumps on same register
version: 1
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=1014618