@@ -18856,12 +18856,15 @@ static int propagate_liveness_reg(struct bpf_verifier_env *env,
1885618856 */
1885718857static int propagate_liveness(struct bpf_verifier_env *env,
1885818858 const struct bpf_verifier_state *vstate,
18859- struct bpf_verifier_state *vparent)
18859+ struct bpf_verifier_state *vparent,
18860+ bool *changed)
1886018861{
1886118862 struct bpf_reg_state *state_reg, *parent_reg;
1886218863 struct bpf_func_state *state, *parent;
1886318864 int i, frame, err = 0;
18865+ bool tmp;
1886418866
18867+ changed = changed ?: &tmp;
1886518868 if (vparent->curframe != vstate->curframe) {
1886618869 WARN(1, "propagate_live: parent frame %d current frame %d\n",
1886718870 vparent->curframe, vstate->curframe);
@@ -18880,6 +18883,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
1888018883 &parent_reg[i]);
1888118884 if (err < 0)
1888218885 return err;
18886+ *changed |= err > 0;
1888318887 if (err == REG_LIVE_READ64)
1888418888 mark_insn_zext(env, &parent_reg[i]);
1888518889 }
@@ -18891,6 +18895,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
1889118895 state_reg = &state->stack[i].spilled_ptr;
1889218896 err = propagate_liveness_reg(env, state_reg,
1889318897 parent_reg);
18898+ *changed |= err > 0;
1889418899 if (err < 0)
1889518900 return err;
1889618901 }
@@ -19266,7 +19271,7 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
1926619271 * they'll be immediately forgotten as we're pruning
1926719272 * this state and will pop a new one.
1926819273 */
19269- err = propagate_liveness(env, &sl->state, cur);
19274+ err = propagate_liveness(env, &sl->state, cur, NULL );
1927019275
1927119276 /* if previous state reached the exit with precision and
1927219277 * current state is equivalent to it (except precision marks)
0 commit comments