bpf: extract same_callsites() as utility function
authorEduard Zingerman <eddyz87@gmail.com>
Tue, 24 Oct 2023 00:09:12 +0000 (03:09 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Feb 2024 00:18:58 +0000 (16:18 -0800)
commit 4c97259abc9bc8df7712f76f58ce385581876857 upstream.

Extract same_callsites() from clean_live_states() as a utility function.
This function would be used by the next patch in the set.

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20231024000917.12153-3-eddyz87@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
kernel/bpf/verifier.c

index 6960978..c1195e7 100644 (file)
@@ -1799,6 +1799,20 @@ static struct bpf_verifier_state_list **explored_state(struct bpf_verifier_env *
        return &env->explored_states[(idx ^ state->callsite) % state_htab_size(env)];
 }
 
+static bool same_callsites(struct bpf_verifier_state *a, struct bpf_verifier_state *b)
+{
+       int fr;
+
+       if (a->curframe != b->curframe)
+               return false;
+
+       for (fr = a->curframe; fr >= 0; fr--)
+               if (a->frame[fr]->callsite != b->frame[fr]->callsite)
+                       return false;
+
+       return true;
+}
+
 static void update_branch_counts(struct bpf_verifier_env *env, struct bpf_verifier_state *st)
 {
        while (st) {
@@ -15521,18 +15535,14 @@ static void clean_live_states(struct bpf_verifier_env *env, int insn,
                              struct bpf_verifier_state *cur)
 {
        struct bpf_verifier_state_list *sl;
-       int i;
 
        sl = *explored_state(env, insn);
        while (sl) {
                if (sl->state.branches)
                        goto next;
                if (sl->state.insn_idx != insn ||
-                   sl->state.curframe != cur->curframe)
+                   !same_callsites(&sl->state, cur))
                        goto next;
-               for (i = 0; i <= cur->curframe; i++)
-                       if (sl->state.frame[i]->callsite != cur->frame[i]->callsite)
-                               goto next;
                clean_verifier_state(env, &sl->state);
 next:
                sl = sl->next;