diff options
Diffstat (limited to 'kernel/bpf/stackmap.c')
| -rw-r--r-- | kernel/bpf/stackmap.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index 90daf285de03..d43b14535827 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -180,11 +180,14 @@ static inline int stack_map_parse_build_id(void *page_addr,  		if (nhdr->n_type == BPF_BUILD_ID &&  		    nhdr->n_namesz == sizeof("GNU") && -		    nhdr->n_descsz == BPF_BUILD_ID_SIZE) { +		    nhdr->n_descsz > 0 && +		    nhdr->n_descsz <= BPF_BUILD_ID_SIZE) {  			memcpy(build_id,  			       note_start + note_offs +  			       ALIGN(sizeof("GNU"), 4) + sizeof(Elf32_Nhdr), -			       BPF_BUILD_ID_SIZE); +			       nhdr->n_descsz); +			memset(build_id + nhdr->n_descsz, 0, +			       BPF_BUILD_ID_SIZE - nhdr->n_descsz);  			return 0;  		}  		new_offs = note_offs + sizeof(Elf32_Nhdr) + @@ -260,7 +263,7 @@ static int stack_map_get_build_id(struct vm_area_struct *vma,  		return -EFAULT;	/* page not mapped */  	ret = -EINVAL; -	page_addr = page_address(page); +	page_addr = kmap_atomic(page);  	ehdr = (Elf32_Ehdr *)page_addr;  	/* compare magic x7f "ELF" */ @@ -276,6 +279,7 @@ static int stack_map_get_build_id(struct vm_area_struct *vma,  	else if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)  		ret = stack_map_get_build_id_64(page_addr, build_id);  out: +	kunmap_atomic(page_addr);  	put_page(page);  	return ret;  } @@ -310,6 +314,7 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs,  		for (i = 0; i < trace_nr; i++) {  			id_offs[i].status = BPF_STACK_BUILD_ID_IP;  			id_offs[i].ip = ips[i]; +			memset(id_offs[i].build_id, 0, BPF_BUILD_ID_SIZE);  		}  		return;  	} @@ -320,6 +325,7 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs,  			/* per entry fall back to ips */  			id_offs[i].status = BPF_STACK_BUILD_ID_IP;  			id_offs[i].ip = ips[i]; +			memset(id_offs[i].build_id, 0, BPF_BUILD_ID_SIZE);  			continue;  		}  		id_offs[i].offset = (vma->vm_pgoff << PAGE_SHIFT) + ips[i]  | 
