• D
    bpf: fix uapi hole for 32 bit compat applications · 36f9814a
    Daniel Borkmann 提交于
    In 64 bit, we have a 4 byte hole between ifindex and netns_dev in the
    case of struct bpf_map_info but also struct bpf_prog_info. In net-next
    commit b85fab0e ("bpf: Add gpl_compatible flag to struct bpf_prog_info")
    added a bitfield into it to expose some flags related to programs. Thus,
    add an unnamed __u32 bitfield for both so that alignment keeps the same
    in both 32 and 64 bit cases, and can be naturally extended from there
    as in b85fab0e.
    
    Before:
    
      # file test.o
      test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
      # pahole test.o
      struct bpf_map_info {
    	__u32                      type;                 /*     0     4 */
    	__u32                      id;                   /*     4     4 */
    	__u32                      key_size;             /*     8     4 */
    	__u32                      value_size;           /*    12     4 */
    	__u32                      max_entries;          /*    16     4 */
    	__u32                      map_flags;            /*    20     4 */
    	char                       name[16];             /*    24    16 */
    	__u32                      ifindex;              /*    40     4 */
    	__u64                      netns_dev;            /*    44     8 */
    	__u64                      netns_ino;            /*    52     8 */
    
    	/* size: 64, cachelines: 1, members: 10 */
    	/* padding: 4 */
      };
    
    After (same as on 64 bit):
    
      # file test.o
      test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
      # pahole test.o
      struct bpf_map_info {
    	__u32                      type;                 /*     0     4 */
    	__u32                      id;                   /*     4     4 */
    	__u32                      key_size;             /*     8     4 */
    	__u32                      value_size;           /*    12     4 */
    	__u32                      max_entries;          /*    16     4 */
    	__u32                      map_flags;            /*    20     4 */
    	char                       name[16];             /*    24    16 */
    	__u32                      ifindex;              /*    40     4 */
    
    	/* XXX 4 bytes hole, try to pack */
    
    	__u64                      netns_dev;            /*    48     8 */
    	__u64                      netns_ino;            /*    56     8 */
    	/* --- cacheline 1 boundary (64 bytes) --- */
    
    	/* size: 64, cachelines: 1, members: 10 */
    	/* sum members: 60, holes: 1, sum holes: 4 */
      };
    Reported-by: NDmitry V. Levin <ldv@altlinux.org>
    Reported-by: NEugene Syromiatnikov <esyr@redhat.com>
    Fixes: 52775b33 ("bpf: offload: report device information about offloaded maps")
    Fixes: 675fc275 ("bpf: offload: report device information for offloaded programs")
    Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: NAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
    36f9814a
bpf.h 36.5 KB