diff options
author | Alexei Starovoitov <ast@fb.com> | 2017-05-30 13:31:29 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-05-31 19:29:47 -0400 |
commit | 8726679a0fa317f8e83d0843b266453f31bff092 (patch) | |
tree | f7a9e45a053516435bcfce3938b39eede5f49435 /kernel | |
parent | f696b8f471ec987e987e38206b8eb23c39ee5a86 (diff) | |
download | linux-8726679a0fa317f8e83d0843b266453f31bff092.tar.gz linux-8726679a0fa317f8e83d0843b266453f31bff092.tar.bz2 linux-8726679a0fa317f8e83d0843b266453f31bff092.zip |
bpf: teach verifier to track stack depth
teach verifier to track bpf program stack depth
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/bpf/verifier.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 28113d0e8e92..d96f27ff9f6f 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -926,6 +926,10 @@ static int check_mem_access(struct bpf_verifier_env *env, u32 regno, int off, verbose("invalid stack off=%d size=%d\n", off, size); return -EACCES; } + + if (env->prog->aux->stack_depth < -off) + env->prog->aux->stack_depth = -off; + if (t == BPF_WRITE) { if (!env->allow_ptr_leaks && state->stack_slot_type[MAX_BPF_STACK + off] == STACK_SPILL && @@ -1032,6 +1036,9 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno, return -EACCES; } + if (env->prog->aux->stack_depth < -off) + env->prog->aux->stack_depth = -off; + if (meta && meta->raw_mode) { meta->access_size = access_size; meta->regno = regno; @@ -3167,7 +3174,8 @@ process_bpf_exit: insn_idx++; } - verbose("processed %d insns\n", insn_processed); + verbose("processed %d insns, stack depth %d\n", + insn_processed, env->prog->aux->stack_depth); return 0; } |