mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	bpf: fix bpf_tail_call() x64 JIT
- bpf prog_array just like all other types of bpf array accepts 32-bit index. Clarify that in the comment. - fix x64 JIT of bpf_tail_call which was incorrectly loading 8 instead of 4 bytes - tighten corresponding check in the interpreter to stay consistent The JIT bug can be triggered after introduction of BPF_F_NUMA_NODE flag in commit96eabe7a40in 4.14. Before that the map_flags would stay zero and though JIT code is wrong it will check bounds correctly. Hence two fixes tags. All other JITs don't have this problem. Signed-off-by: Alexei Starovoitov <ast@kernel.org> Fixes:96eabe7a40("bpf: Allow selecting numa node during map creation") Fixes:b52f00e6a7("x86: bpf_jit: implement bpf_tail_call() helper") Acked-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Martin KaFai Lau <kafai@fb.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									05946876f0
								
							
						
					
					
						commit
						90caccdd8c
					
				
					 3 changed files with 4 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -284,9 +284,9 @@ static void emit_bpf_tail_call(u8 **pprog)
 | 
			
		|||
	/* if (index >= array->map.max_entries)
 | 
			
		||||
	 *   goto out;
 | 
			
		||||
	 */
 | 
			
		||||
	EMIT4(0x48, 0x8B, 0x46,                   /* mov rax, qword ptr [rsi + 16] */
 | 
			
		||||
	EMIT2(0x89, 0xD2);                        /* mov edx, edx */
 | 
			
		||||
	EMIT3(0x39, 0x56,                         /* cmp dword ptr [rsi + 16], edx */
 | 
			
		||||
	      offsetof(struct bpf_array, map.max_entries));
 | 
			
		||||
	EMIT3(0x48, 0x39, 0xD0);                  /* cmp rax, rdx */
 | 
			
		||||
#define OFFSET1 43 /* number of bytes to jump */
 | 
			
		||||
	EMIT2(X86_JBE, OFFSET1);                  /* jbe out */
 | 
			
		||||
	label1 = cnt;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -312,7 +312,7 @@ union bpf_attr {
 | 
			
		|||
 *     jump into another BPF program
 | 
			
		||||
 *     @ctx: context pointer passed to next program
 | 
			
		||||
 *     @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY
 | 
			
		||||
 *     @index: index inside array that selects specific program to run
 | 
			
		||||
 *     @index: 32-bit index inside array that selects specific program to run
 | 
			
		||||
 *     Return: 0 on success or negative error
 | 
			
		||||
 *
 | 
			
		||||
 * int bpf_clone_redirect(skb, ifindex, flags)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1022,7 +1022,7 @@ static unsigned int ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn,
 | 
			
		|||
		struct bpf_map *map = (struct bpf_map *) (unsigned long) BPF_R2;
 | 
			
		||||
		struct bpf_array *array = container_of(map, struct bpf_array, map);
 | 
			
		||||
		struct bpf_prog *prog;
 | 
			
		||||
		u64 index = BPF_R3;
 | 
			
		||||
		u32 index = BPF_R3;
 | 
			
		||||
 | 
			
		||||
		if (unlikely(index >= array->map.max_entries))
 | 
			
		||||
			goto out;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue