@@ -11008,6 +11008,10 @@ static int prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx)
1100811008 bool in_callback_fn;
1100911009 int err;
1101011010
11011+ err = bpf_update_live_stack(env);
11012+ if (err)
11013+ return err;
11014+
1101111015 callee = state->frame[state->curframe];
1101211016 r0 = &callee->regs[BPF_REG_0];
1101311017 if (r0->type == PTR_TO_STACK) {
@@ -11404,8 +11408,7 @@ static inline bool in_sleepable_context(struct bpf_verifier_env *env)
1140411408
1140511409static int check_helper_call(struct bpf_verifier_env *env,
1140611410 struct bpf_insn *insn,
11407- int *insn_idx_p,
11408- bool *do_print_state)
11411+ int *insn_idx_p)
1140911412{
1141011413 enum bpf_prog_type prog_type = resolve_prog_type(env->prog);
1141111414 bool returns_cpu_specific_alloc_ptr = false;
@@ -11917,18 +11920,21 @@ static int check_helper_call(struct bpf_verifier_env *env,
1191711920 }
1191811921
1191911922 if (func_id == BPF_FUNC_tail_call) {
11920- struct bpf_verifier_state *branch;
11921- mark_reg_scratched(env, BPF_REG_0) ;
11922- branch = push_stack (env, env->insn_idx + 1, env->insn_idx, false );
11923- if (IS_ERR(branch))
11924- return PTR_ERR( branch);
11925- clear_all_pkt_pointers(env );
11926- mark_reg_unknown (env, regs, BPF_REG_0 );
11927- err = process_bpf_exit_full (env, do_print_state, false );
11928- if (err)
11929- return err;
11930- else
11923+ if (env->cur_state->curframe) {
11924+ struct bpf_verifier_state *branch ;
11925+ mark_reg_scratched (env, BPF_REG_0 );
11926+ branch = push_stack(env, env->insn_idx + 1, env->insn_idx, false);
11927+ if (IS_ERR( branch))
11928+ return PTR_ERR(branch );
11929+ clear_all_pkt_pointers (env);
11930+ mark_reg_unknown (env, regs, BPF_REG_0 );
11931+ err = prepare_func_exit(env, &env->insn_idx);
11932+ if ( err)
11933+ return err;
1193111934 env->insn_idx--;
11935+ } else {
11936+ changes_data = false;
11937+ }
1193211938 }
1193311939
1193411940 if (changes_data)
@@ -19865,9 +19871,6 @@ static int process_bpf_exit_full(struct bpf_verifier_env *env,
1986519871 return PROCESS_BPF_EXIT;
1986619872
1986719873 if (env->cur_state->curframe) {
19868- err = bpf_update_live_stack(env);
19869- if (err)
19870- return err;
1987119874 /* exit from nested function */
1987219875 err = prepare_func_exit(env, &env->insn_idx);
1987319876 if (err)
@@ -19977,7 +19980,7 @@ static int do_check_insn(struct bpf_verifier_env *env, bool *do_print_state)
1997719980 if (!err && is_bpf_throw_kfunc(insn))
1997819981 return process_bpf_exit_full(env, do_print_state, true);
1997919982 } else {
19980- err = check_helper_call(env, insn, &env->insn_idx, do_print_state );
19983+ err = check_helper_call(env, insn, &env->insn_idx);
1998119984 }
1998219985 if (err)
1998319986 return err;
0 commit comments