forked from mirrors/linux
		
	bpf: fix uapi hole for 32 bit compat applications
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 commitb85fab0e67("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 inb85fab0e67. 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: Dmitry V. Levin <ldv@altlinux.org> Reported-by: Eugene Syromiatnikov <esyr@redhat.com> Fixes:52775b33bb("bpf: offload: report device information about offloaded maps") Fixes:675fc275a3("bpf: offload: report device information for offloaded programs") Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
		
							parent
							
								
									8005b09d99
								
							
						
					
					
						commit
						36f9814a49
					
				
					 2 changed files with 4 additions and 0 deletions
				
			
		|  | @ -1017,6 +1017,7 @@ struct bpf_prog_info { | |||
| 	__aligned_u64 map_ids; | ||||
| 	char name[BPF_OBJ_NAME_LEN]; | ||||
| 	__u32 ifindex; | ||||
| 	__u32 :32; | ||||
| 	__u64 netns_dev; | ||||
| 	__u64 netns_ino; | ||||
| } __attribute__((aligned(8))); | ||||
|  | @ -1030,6 +1031,7 @@ struct bpf_map_info { | |||
| 	__u32 map_flags; | ||||
| 	char  name[BPF_OBJ_NAME_LEN]; | ||||
| 	__u32 ifindex; | ||||
| 	__u32 :32; | ||||
| 	__u64 netns_dev; | ||||
| 	__u64 netns_ino; | ||||
| } __attribute__((aligned(8))); | ||||
|  |  | |||
|  | @ -1017,6 +1017,7 @@ struct bpf_prog_info { | |||
| 	__aligned_u64 map_ids; | ||||
| 	char name[BPF_OBJ_NAME_LEN]; | ||||
| 	__u32 ifindex; | ||||
| 	__u32 :32; | ||||
| 	__u64 netns_dev; | ||||
| 	__u64 netns_ino; | ||||
| } __attribute__((aligned(8))); | ||||
|  | @ -1030,6 +1031,7 @@ struct bpf_map_info { | |||
| 	__u32 map_flags; | ||||
| 	char  name[BPF_OBJ_NAME_LEN]; | ||||
| 	__u32 ifindex; | ||||
| 	__u32 :32; | ||||
| 	__u64 netns_dev; | ||||
| 	__u64 netns_ino; | ||||
| } __attribute__((aligned(8))); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Daniel Borkmann
						Daniel Borkmann