Skip to content

Commit eb949f8

Browse files
eddyz87Kernel Patches Daemon
authored andcommitted
bpf: account for current allocated stack depth in widen_imprecise_scalars()
The usage pattern for widen_imprecise_scalars() looks as follows: prev_st = find_prev_entry(env, ...); queued_st = push_stack(...); widen_imprecise_scalars(env, prev_st, queued_st); Where prev_st is an ancestor of the queued_st in the explored states tree. This ancestor is not guaranteed to have same allocated stack depth as queued_st. E.g. in the following case: def main(): for i in 1..2: foo(i) // same callsite, differnt param def foo(i): if i == 1: use 128 bytes of stack iterator based loop Here, for a second 'foo' call prev_st->allocated_stack is 128, while queued_st->allocated_stack is much smaller. widen_imprecise_scalars() needs to take this into account and avoid accessing bpf_verifier_state->frame[*]->stack out of bounds. Fixes: 2793a8b ("bpf: exact states comparison for iterator convergence checks") Reported-by: Emil Tsalapatis <[email protected]> Signed-off-by: Eduard Zingerman <[email protected]>
1 parent 43130ba commit eb949f8

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

kernel/bpf/verifier.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8866,7 +8866,7 @@ static int widen_imprecise_scalars(struct bpf_verifier_env *env,
88668866
struct bpf_verifier_state *cur)
88678867
{
88688868
struct bpf_func_state *fold, *fcur;
8869-
int i, fr;
8869+
int i, fr, num_slots;
88708870

88718871
reset_idmap_scratch(env);
88728872
for (fr = old->curframe; fr >= 0; fr--) {
@@ -8879,7 +8879,9 @@ static int widen_imprecise_scalars(struct bpf_verifier_env *env,
88798879
&fcur->regs[i],
88808880
&env->idmap_scratch);
88818881

8882-
for (i = 0; i < fold->allocated_stack / BPF_REG_SIZE; i++) {
8882+
num_slots = min(fold->allocated_stack / BPF_REG_SIZE,
8883+
fcur->allocated_stack / BPF_REG_SIZE);
8884+
for (i = 0; i < num_slots; i++) {
88838885
if (!is_spilled_reg(&fold->stack[i]) ||
88848886
!is_spilled_reg(&fcur->stack[i]))
88858887
continue;

0 commit comments

Comments
 (0)