diff options
| -rw-r--r-- | kernel/bpf/verifier.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 5f0eb5bd5589..423f242a5efb 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c | |||
| @@ -8132,9 +8132,11 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, | |||
| 8132 | env->insn_aux_data[i].orig_idx = i; | 8132 | env->insn_aux_data[i].orig_idx = i; |
| 8133 | env->prog = *prog; | 8133 | env->prog = *prog; |
| 8134 | env->ops = bpf_verifier_ops[env->prog->type]; | 8134 | env->ops = bpf_verifier_ops[env->prog->type]; |
| 8135 | is_priv = capable(CAP_SYS_ADMIN); | ||
| 8135 | 8136 | ||
| 8136 | /* grab the mutex to protect few globals used by verifier */ | 8137 | /* grab the mutex to protect few globals used by verifier */ |
| 8137 | mutex_lock(&bpf_verifier_lock); | 8138 | if (!is_priv) |
| 8139 | mutex_lock(&bpf_verifier_lock); | ||
| 8138 | 8140 | ||
| 8139 | if (attr->log_level || attr->log_buf || attr->log_size) { | 8141 | if (attr->log_level || attr->log_buf || attr->log_size) { |
| 8140 | /* user requested verbose verifier output | 8142 | /* user requested verbose verifier output |
| @@ -8157,7 +8159,6 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, | |||
| 8157 | if (attr->prog_flags & BPF_F_ANY_ALIGNMENT) | 8159 | if (attr->prog_flags & BPF_F_ANY_ALIGNMENT) |
| 8158 | env->strict_alignment = false; | 8160 | env->strict_alignment = false; |
| 8159 | 8161 | ||
| 8160 | is_priv = capable(CAP_SYS_ADMIN); | ||
| 8161 | env->allow_ptr_leaks = is_priv; | 8162 | env->allow_ptr_leaks = is_priv; |
| 8162 | 8163 | ||
| 8163 | ret = replace_map_fd_with_map_ptr(env); | 8164 | ret = replace_map_fd_with_map_ptr(env); |
| @@ -8270,7 +8271,8 @@ err_release_maps: | |||
| 8270 | release_maps(env); | 8271 | release_maps(env); |
| 8271 | *prog = env->prog; | 8272 | *prog = env->prog; |
| 8272 | err_unlock: | 8273 | err_unlock: |
| 8273 | mutex_unlock(&bpf_verifier_lock); | 8274 | if (!is_priv) |
| 8275 | mutex_unlock(&bpf_verifier_lock); | ||
| 8274 | vfree(env->insn_aux_data); | 8276 | vfree(env->insn_aux_data); |
| 8275 | err_free_env: | 8277 | err_free_env: |
| 8276 | kfree(env); | 8278 | kfree(env); |
