Skip to content

Commit b63cbc4

Browse files
anakryikoMartin KaFai Lau
authored andcommitted
bpf: remember meta->iter info only for initialized iters
For iter_new() functions iterator state's slot might not be yet initialized, in which case iter_get_spi() will return -ERANGE. This is expected and is handled properly. But for iter_next() and iter_destroy() cases iter slot is supposed to be initialized and correct, so -ERANGE is not possible. Move meta->iter.{spi,frameno} initialization into iter_next/iter_destroy handling branch to make it more explicit that valid information will be remembered in meta->iter block for subsequent use in process_iter_next_call(), avoiding confusingly looking -ERANGE assignment for meta->iter.spi. Reported-by: Dan Carpenter <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Martin KaFai Lau <[email protected]>
1 parent 1a3148f commit b63cbc4

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

kernel/bpf/verifier.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6778,13 +6778,6 @@ static int process_iter_arg(struct bpf_verifier_env *env, int regno, int insn_id
67786778
t = btf_type_skip_modifiers(meta->btf, t->type, &btf_id); /* STRUCT */
67796779
nr_slots = t->size / BPF_REG_SIZE;
67806780

6781-
spi = iter_get_spi(env, reg, nr_slots);
6782-
if (spi < 0 && spi != -ERANGE)
6783-
return spi;
6784-
6785-
meta->iter.spi = spi;
6786-
meta->iter.frameno = reg->frameno;
6787-
67886781
if (is_iter_new_kfunc(meta)) {
67896782
/* bpf_iter_<type>_new() expects pointer to uninit iter state */
67906783
if (!is_iter_reg_valid_uninit(env, reg, nr_slots)) {
@@ -6811,10 +6804,17 @@ static int process_iter_arg(struct bpf_verifier_env *env, int regno, int insn_id
68116804
return -EINVAL;
68126805
}
68136806

6807+
spi = iter_get_spi(env, reg, nr_slots);
6808+
if (spi < 0)
6809+
return spi;
6810+
68146811
err = mark_iter_read(env, reg, spi, nr_slots);
68156812
if (err)
68166813
return err;
68176814

6815+
/* remember meta->iter info for process_iter_next_call() */
6816+
meta->iter.spi = spi;
6817+
meta->iter.frameno = reg->frameno;
68186818
meta->ref_obj_id = iter_ref_obj_id(env, reg, spi);
68196819

68206820
if (is_iter_destroy_kfunc(meta)) {

0 commit comments

Comments
 (0)