]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: Refactor mark_{dynptr,iter}_read
authorKumar Kartikeya Dwivedi <memxor@gmail.com>
Wed, 4 Dec 2024 03:03:56 +0000 (19:03 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 4 Dec 2024 16:38:29 +0000 (08:38 -0800)
There is possibility of sharing code between mark_dynptr_read and
mark_iter_read for updating liveness information of their stack slots.
Consolidate common logic into mark_stack_slot_obj_read function in
preparation for the next patch which needs the same logic for its own
stack slots.

Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20241204030400.208005-4-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 41b3dc1ce450edaf223b21e8936b63c220d7bd29..b4a486abe13430f65c955c391bfc3d02a8979ebb 100644 (file)
@@ -3191,10 +3191,27 @@ static int mark_reg_read(struct bpf_verifier_env *env,
        return 0;
 }
 
-static int mark_dynptr_read(struct bpf_verifier_env *env, struct bpf_reg_state *reg)
+static int mark_stack_slot_obj_read(struct bpf_verifier_env *env, struct bpf_reg_state *reg,
+                                   int spi, int nr_slots)
 {
        struct bpf_func_state *state = func(env, reg);
-       int spi, ret;
+       int err, i;
+
+       for (i = 0; i < nr_slots; i++) {
+               struct bpf_reg_state *st = &state->stack[spi - i].spilled_ptr;
+
+               err = mark_reg_read(env, st, st->parent, REG_LIVE_READ64);
+               if (err)
+                       return err;
+
+               mark_stack_slot_scratched(env, spi - i);
+       }
+       return 0;
+}
+
+static int mark_dynptr_read(struct bpf_verifier_env *env, struct bpf_reg_state *reg)
+{
+       int spi;
 
        /* For CONST_PTR_TO_DYNPTR, it must have already been done by
         * check_reg_arg in check_helper_call and mark_btf_func_reg_size in
@@ -3209,31 +3226,13 @@ static int mark_dynptr_read(struct bpf_verifier_env *env, struct bpf_reg_state *
         * bounds and spi is the first dynptr slot. Simply mark stack slot as
         * read.
         */
-       ret = mark_reg_read(env, &state->stack[spi].spilled_ptr,
-                           state->stack[spi].spilled_ptr.parent, REG_LIVE_READ64);
-       if (ret)
-               return ret;
-       return mark_reg_read(env, &state->stack[spi - 1].spilled_ptr,
-                            state->stack[spi - 1].spilled_ptr.parent, REG_LIVE_READ64);
+       return mark_stack_slot_obj_read(env, reg, spi, BPF_DYNPTR_NR_SLOTS);
 }
 
 static int mark_iter_read(struct bpf_verifier_env *env, struct bpf_reg_state *reg,
                          int spi, int nr_slots)
 {
-       struct bpf_func_state *state = func(env, reg);
-       int err, i;
-
-       for (i = 0; i < nr_slots; i++) {
-               struct bpf_reg_state *st = &state->stack[spi - i].spilled_ptr;
-
-               err = mark_reg_read(env, st, st->parent, REG_LIVE_READ64);
-               if (err)
-                       return err;
-
-               mark_stack_slot_scratched(env, spi - i);
-       }
-
-       return 0;
+       return mark_stack_slot_obj_read(env, reg, spi, nr_slots);
 }
 
 /* This function is supposed to be used by the following 32-bit optimization