Skip to content

Commit 6b1338f

Browse files
Alexei StarovoitovKernel Patches Daemon
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> Acked-by: Eduard Zingerman <eddyz87@gmail.com> Reviewed-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Amery Hung <ameryhung@gmail.com>
1 parent e0b86fd commit 6b1338f

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

kernel/bpf/verifier.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19915,7 +19915,11 @@ 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;
1992019924
/* If the offsets don't match, we can't trust our alignment;
1992119925
* nor can we be sure that we won't fall out of range.

0 commit comments

Comments
 (0)