Skip to content

Commit a8502a7

Browse files
Alexei Starovoitovanakryiko
authored andcommitted
bpf: Fix regsafe() for pointers to packet
In case rold->reg->range == BEYOND_PKT_END && rcur->reg->range == N regsafe() may return true which may lead to current state with valid packet range not being explored. Fix the bug. Fixes: 6d94e74 ("bpf: Support for pointers beyond pkt_end.") Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Reviewed-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Amery Hung <ameryhung@gmail.com> Acked-by: Eduard Zingerman <eddyz87@gmail.com> Link: https://lore.kernel.org/bpf/20260331204228.26726-1-alexei.starovoitov@gmail.com
1 parent dbf00d8 commit a8502a7

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

kernel/bpf/verifier.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19915,8 +19915,13 @@ static bool regsafe(struct bpf_verifier_env *env, struct bpf_reg_state *rold,
1991519915
* since someone could have accessed through (ptr - k), or
1991619916
* even done ptr -= k in a register, to get a safe access.
1991719917
*/
19918-
if (rold->range > rcur->range)
19918+
if (rold->range < 0 || rcur->range < 0) {
19919+
/* special case for [BEYOND|AT]_PKT_END */
19920+
if (rold->range != rcur->range)
19921+
return false;
19922+
} else if (rold->range > rcur->range) {
1991919923
return false;
19924+
}
1992019925
/* If the offsets don't match, we can't trust our alignment;
1992119926
* nor can we be sure that we won't fall out of range.
1992219927
*/

0 commit comments

Comments
 (0)