]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Add a check to make static analysers happy
authorAnton Protopopov <a.s.protopopov@gmail.com>
Wed, 19 Nov 2025 11:25:17 +0000 (11:25 +0000)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 22 Nov 2025 01:01:14 +0000 (17:01 -0800)
In [1] Dan Carpenter reported that the following code makes the
Smatch static analyser unhappy:

        17904       value = map->ops->map_lookup_elem(map, &i);
        17905       if (!value)
        17906               return -EINVAL;
    --> 17907       items[i - start] = value->xlated_off;

The analyser assumes that the `value` variable may contain an error
and thus it should be properly checked before the dereference.
On practice this will never happen as array maps do not return
error values in map_lookup_elem, but to make the Smatch and other
possible analysers happy this patch adds a formal check.

Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Closes: https://lore.kernel.org/bpf/aR2BN1Ix--8tmVrN@stanley.mountain/ [1]
Fixes: 493d9e0d6083 ("bpf, x86: add support for indirect jumps")
Signed-off-by: Anton Protopopov <a.s.protopopov@gmail.com>
Link: https://lore.kernel.org/r/20251119112517.1091793-1-a.s.protopopov@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 098dd7f21c8936656af23056331bd9f66919a4e1..93716da57d481120b9512bc4a674b66cd6eb090d 100644 (file)
@@ -17929,7 +17929,13 @@ static int copy_insn_array(struct bpf_map *map, u32 start, u32 end, u32 *items)
 
        for (i = start; i <= end; i++) {
                value = map->ops->map_lookup_elem(map, &i);
-               if (!value)
+               /*
+                * map_lookup_elem of an array map will never return an error,
+                * but not checking it makes some static analysers to worry
+                */
+               if (IS_ERR(value))
+                       return PTR_ERR(value);
+               else if (!value)
                        return -EINVAL;
                items[i - start] = value->xlated_off;
        }