aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/bpf/verifier.c8
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;
8272err_unlock: 8273err_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);
8275err_free_env: 8277err_free_env:
8276 kfree(env); 8278 kfree(env);