|
@@ -5430,6 +5430,10 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
|
|
if (insn->code != (BPF_JMP | BPF_CALL) ||
|
|
|
insn->src_reg != BPF_PSEUDO_CALL)
|
|
|
continue;
|
|
|
+ /* Upon error here we cannot fall back to interpreter but
|
|
|
+ * need a hard reject of the program. Thus -EFAULT is
|
|
|
+ * propagated in any case.
|
|
|
+ */
|
|
|
subprog = find_subprog(env, i + insn->imm + 1);
|
|
|
if (subprog < 0) {
|
|
|
WARN_ONCE(1, "verifier bug. No program starts at insn %d\n",
|
|
@@ -5450,7 +5454,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
|
|
|
|
|
func = kcalloc(env->subprog_cnt, sizeof(prog), GFP_KERNEL);
|
|
|
if (!func)
|
|
|
- return -ENOMEM;
|
|
|
+ goto out_undo_insn;
|
|
|
|
|
|
for (i = 0; i < env->subprog_cnt; i++) {
|
|
|
subprog_start = subprog_end;
|
|
@@ -5515,7 +5519,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
|
|
tmp = bpf_int_jit_compile(func[i]);
|
|
|
if (tmp != func[i] || func[i]->bpf_func != old_bpf_func) {
|
|
|
verbose(env, "JIT doesn't support bpf-to-bpf calls\n");
|
|
|
- err = -EFAULT;
|
|
|
+ err = -ENOTSUPP;
|
|
|
goto out_free;
|
|
|
}
|
|
|
cond_resched();
|
|
@@ -5552,6 +5556,7 @@ out_free:
|
|
|
if (func[i])
|
|
|
bpf_jit_free(func[i]);
|
|
|
kfree(func);
|
|
|
+out_undo_insn:
|
|
|
/* cleanup main prog to be interpreted */
|
|
|
prog->jit_requested = 0;
|
|
|
for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
|
|
@@ -5578,6 +5583,8 @@ static int fixup_call_args(struct bpf_verifier_env *env)
|
|
|
err = jit_subprogs(env);
|
|
|
if (err == 0)
|
|
|
return 0;
|
|
|
+ if (err == -EFAULT)
|
|
|
+ return err;
|
|
|
}
|
|
|
#ifndef CONFIG_BPF_JIT_ALWAYS_ON
|
|
|
for (i = 0; i < prog->len; i++, insn++) {
|