diff options
author | Alexei Starovoitov <ast@kernel.org> | 2019-04-02 00:27:43 -0400 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-04-03 19:27:38 -0400 |
commit | 71dde681a8cea1ccff2c7b3be83c043ab6b2a977 (patch) | |
tree | aa61a0ecaa19dd6476634403f595c80b2c0a1ca5 /kernel/bpf | |
parent | 25af32dad8047d180e70e233c85b909dd6587cc5 (diff) |
bpf: convert temp arrays to kvcalloc
Temporary arrays used during program verification need to be vmalloc-ed
to support large bpf programs.
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'kernel/bpf')
-rw-r--r-- | kernel/bpf/verifier.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 94cf6efc5df6..ad3494a881da 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c | |||
@@ -5313,13 +5313,13 @@ static int check_cfg(struct bpf_verifier_env *env) | |||
5313 | int ret = 0; | 5313 | int ret = 0; |
5314 | int i, t; | 5314 | int i, t; |
5315 | 5315 | ||
5316 | insn_state = kcalloc(insn_cnt, sizeof(int), GFP_KERNEL); | 5316 | insn_state = kvcalloc(insn_cnt, sizeof(int), GFP_KERNEL); |
5317 | if (!insn_state) | 5317 | if (!insn_state) |
5318 | return -ENOMEM; | 5318 | return -ENOMEM; |
5319 | 5319 | ||
5320 | insn_stack = kcalloc(insn_cnt, sizeof(int), GFP_KERNEL); | 5320 | insn_stack = kvcalloc(insn_cnt, sizeof(int), GFP_KERNEL); |
5321 | if (!insn_stack) { | 5321 | if (!insn_stack) { |
5322 | kfree(insn_state); | 5322 | kvfree(insn_state); |
5323 | return -ENOMEM; | 5323 | return -ENOMEM; |
5324 | } | 5324 | } |
5325 | 5325 | ||
@@ -5417,8 +5417,8 @@ check_state: | |||
5417 | ret = 0; /* cfg looks good */ | 5417 | ret = 0; /* cfg looks good */ |
5418 | 5418 | ||
5419 | err_free: | 5419 | err_free: |
5420 | kfree(insn_state); | 5420 | kvfree(insn_state); |
5421 | kfree(insn_stack); | 5421 | kvfree(insn_stack); |
5422 | return ret; | 5422 | return ret; |
5423 | } | 5423 | } |
5424 | 5424 | ||
@@ -7898,7 +7898,7 @@ static void free_states(struct bpf_verifier_env *env) | |||
7898 | } | 7898 | } |
7899 | } | 7899 | } |
7900 | 7900 | ||
7901 | kfree(env->explored_states); | 7901 | kvfree(env->explored_states); |
7902 | } | 7902 | } |
7903 | 7903 | ||
7904 | static void print_verification_stats(struct bpf_verifier_env *env) | 7904 | static void print_verification_stats(struct bpf_verifier_env *env) |
@@ -7994,7 +7994,7 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, | |||
7994 | goto skip_full_check; | 7994 | goto skip_full_check; |
7995 | } | 7995 | } |
7996 | 7996 | ||
7997 | env->explored_states = kcalloc(env->prog->len, | 7997 | env->explored_states = kvcalloc(env->prog->len, |
7998 | sizeof(struct bpf_verifier_state_list *), | 7998 | sizeof(struct bpf_verifier_state_list *), |
7999 | GFP_USER); | 7999 | GFP_USER); |
8000 | ret = -ENOMEM; | 8000 | ret = -ENOMEM; |