Commit 1bf81f7
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 4d7050b commit 1bf81f7
1 file changed
+4
-2
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8866 | 8866 | | |
8867 | 8867 | | |
8868 | 8868 | | |
8869 | | - | |
| 8869 | + | |
8870 | 8870 | | |
8871 | 8871 | | |
8872 | 8872 | | |
| |||
8879 | 8879 | | |
8880 | 8880 | | |
8881 | 8881 | | |
8882 | | - | |
| 8882 | + | |
| 8883 | + | |
| 8884 | + | |
8883 | 8885 | | |
8884 | 8886 | | |
8885 | 8887 | | |
| |||
0 commit comments