]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: fix end-of-list detection in cgroup_storage_get_next_key()
authorWeiming Shi <bestswngs@gmail.com>
Fri, 3 Apr 2026 13:29:50 +0000 (21:29 +0800)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 6 Apr 2026 01:45:05 +0000 (18:45 -0700)
list_next_entry() never returns NULL -- when the current element is the
last entry it wraps to the list head via container_of(). The subsequent
NULL check is therefore dead code and get_next_key() never returns
-ENOENT for the last element, instead reading storage->key from a bogus
pointer that aliases internal map fields and copying the result to
userspace.

Replace it with list_entry_is_head() so the function correctly returns
-ENOENT when there are no more entries.

Fixes: de9cbbaadba5 ("bpf: introduce cgroup storage maps")
Reported-by: Xiang Mei <xmei5@asu.edu>
Signed-off-by: Weiming Shi <bestswngs@gmail.com>
Reviewed-by: Sun Jian <sun.jian.kdev@gmail.com>
Acked-by: Paul Chaignon <paul.chaignon@gmail.com>
Link: https://lore.kernel.org/r/20260403132951.43533-2-bestswngs@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/local_storage.c

index 8fca0c64f7b1cdb7980f1fa53126e35c005ba574..23267213a17fb79729746bac1ca26f2cfa99835e 100644 (file)
@@ -270,7 +270,7 @@ static int cgroup_storage_get_next_key(struct bpf_map *_map, void *key,
                        goto enoent;
 
                storage = list_next_entry(storage, list_map);
-               if (!storage)
+               if (list_entry_is_head(storage, &map->list, list_map))
                        goto enoent;
        } else {
                storage = list_first_entry(&map->list,