@@ -18856,12 +18856,15 @@ static int propagate_liveness_reg(struct bpf_verifier_env *env,
18856
18856
*/
18857
18857
static int propagate_liveness(struct bpf_verifier_env *env,
18858
18858
const struct bpf_verifier_state *vstate,
18859
- struct bpf_verifier_state *vparent)
18859
+ struct bpf_verifier_state *vparent,
18860
+ bool *changed)
18860
18861
{
18861
18862
struct bpf_reg_state *state_reg, *parent_reg;
18862
18863
struct bpf_func_state *state, *parent;
18863
18864
int i, frame, err = 0;
18865
+ bool tmp;
18864
18866
18867
+ changed = changed ?: &tmp;
18865
18868
if (vparent->curframe != vstate->curframe) {
18866
18869
WARN(1, "propagate_live: parent frame %d current frame %d\n",
18867
18870
vparent->curframe, vstate->curframe);
@@ -18880,6 +18883,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
18880
18883
&parent_reg[i]);
18881
18884
if (err < 0)
18882
18885
return err;
18886
+ *changed |= err > 0;
18883
18887
if (err == REG_LIVE_READ64)
18884
18888
mark_insn_zext(env, &parent_reg[i]);
18885
18889
}
@@ -18891,6 +18895,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
18891
18895
state_reg = &state->stack[i].spilled_ptr;
18892
18896
err = propagate_liveness_reg(env, state_reg,
18893
18897
parent_reg);
18898
+ *changed |= err > 0;
18894
18899
if (err < 0)
18895
18900
return err;
18896
18901
}
@@ -19266,7 +19271,7 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
19266
19271
* they'll be immediately forgotten as we're pruning
19267
19272
* this state and will pop a new one.
19268
19273
*/
19269
- err = propagate_liveness(env, &sl->state, cur);
19274
+ err = propagate_liveness(env, &sl->state, cur, NULL );
19270
19275
19271
19276
/* if previous state reached the exit with precision and
19272
19277
* current state is equivalent to it (except precision marks)
0 commit comments