bpf: Build-time assert that cpumask offset is zero
authorDavid Vernet <void@manifault.com>
Sat, 28 Jan 2023 14:15:37 +0000 (08:15 -0600)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 28 Jan 2023 20:21:40 +0000 (12:21 -0800)
The first element of a struct bpf_cpumask is a cpumask_t. This is done
to allow struct bpf_cpumask to be cast to a struct cpumask. If this
element were ever moved to another field, any BPF program passing a
struct bpf_cpumask * to a kfunc expecting a const struct cpumask * would
immediately fail to load. Add a build-time assertion so this is
assumption is captured and verified.

Signed-off-by: David Vernet <void@manifault.com>
Link: https://lore.kernel.org/r/20230128141537.100777-1-void@manifault.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/cpumask.c

index 25355a0a367a2c11e537982c18621c9d7859b742..6bbb67dfc998457f40880d49e4e871e38c170908 100644 (file)
@@ -52,6 +52,9 @@ struct bpf_cpumask *bpf_cpumask_create(void)
 {
        struct bpf_cpumask *cpumask;
 
+       /* cpumask must be the first element so struct bpf_cpumask be cast to struct cpumask. */
+       BUILD_BUG_ON(offsetof(struct bpf_cpumask, cpumask) != 0);
+
        cpumask = bpf_mem_alloc(&bpf_cpumask_ma, sizeof(*cpumask));
        if (!cpumask)
                return NULL;