]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bpf: Pack struct bpf_fib_lookup
authorAnton Protopopov <aspsk@isovalent.com>
Wed, 3 Apr 2024 12:33:03 +0000 (14:33 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 May 2024 07:49:08 +0000 (09:49 +0200)
[ Upstream commit f91717007217d975aa975ddabd91ae1a107b9bff ]

The struct bpf_fib_lookup is supposed to be of size 64. A recent commit
59b418c7063d ("bpf: Add a check for struct bpf_fib_lookup size") added
a static assertion to check this property so that future changes to the
structure will not accidentally break this assumption.

As it immediately turned out, on some 32-bit arm systems, when AEABI=n,
the total size of the structure was equal to 68, see [1]. This happened
because the bpf_fib_lookup structure contains a union of two 16-bit
fields:

    union {
            __u16 tot_len;
            __u16 mtu_result;
    };

which was supposed to compile to a 16-bit-aligned 16-bit field. On the
aforementioned setups it was instead both aligned and padded to 32-bits.

Declare this inner union as __attribute__((packed, aligned(2))) such
that it always is of size 2 and is aligned to 16 bits.

  [1] https://lore.kernel.org/all/CA+G9fYtsoP51f-oP_Sp5MOq-Ffv8La2RztNpwvE6+R1VtFiLrw@mail.gmail.com/#t

Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org>
Fixes: e1850ea9bd9e ("bpf: bpf_fib_lookup return MTU value as output when looked up")
Signed-off-by: Anton Protopopov <aspsk@isovalent.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20240403123303.1452184-1-aspsk@isovalent.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/uapi/linux/bpf.h
tools/include/uapi/linux/bpf.h

index 754e68ca8744cc5db4416ef4fc37fcef4d5ae5bc..83f31916e2635139f6b7f375badcc8f81b88fbea 100644 (file)
@@ -7040,7 +7040,7 @@ struct bpf_fib_lookup {
 
                /* output: MTU value */
                __u16   mtu_result;
-       };
+       } __attribute__((packed, aligned(2)));
        /* input: L3 device index for lookup
         * output: device index from FIB lookup
         */
index 7f24d898efbb43b48c1e4733ce03952bc3183bbe..a12f597a1c47faf434468e76f0dfad3a8f311e73 100644 (file)
@@ -7039,7 +7039,7 @@ struct bpf_fib_lookup {
 
                /* output: MTU value */
                __u16   mtu_result;
-       };
+       } __attribute__((packed, aligned(2)));
        /* input: L3 device index for lookup
         * output: device index from FIB lookup
         */