diff options
Diffstat (limited to 'kernel/bpf/syscall.c')
| -rw-r--r-- | kernel/bpf/syscall.c | 11 | 
1 files changed, 7 insertions, 4 deletions
| diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 4e50c0bfdb7d..1cad6979a0d0 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -543,8 +543,10 @@ static void bpf_map_show_fdinfo(struct seq_file *m, struct file *filp)  	if (map->map_type == BPF_MAP_TYPE_PROG_ARRAY) {  		array = container_of(map, struct bpf_array, map); -		type  = array->aux->type; -		jited = array->aux->jited; +		spin_lock(&array->aux->owner.lock); +		type  = array->aux->owner.type; +		jited = array->aux->owner.jited; +		spin_unlock(&array->aux->owner.lock);  	}  	seq_printf(m, @@ -1337,12 +1339,11 @@ int generic_map_update_batch(struct bpf_map *map,  	void __user *values = u64_to_user_ptr(attr->batch.values);  	void __user *keys = u64_to_user_ptr(attr->batch.keys);  	u32 value_size, cp, max_count; -	int ufd = attr->map_fd; +	int ufd = attr->batch.map_fd;  	void *key, *value;  	struct fd f;  	int err = 0; -	f = fdget(ufd);  	if (attr->batch.elem_flags & ~BPF_F_LOCK)  		return -EINVAL; @@ -1367,6 +1368,7 @@ int generic_map_update_batch(struct bpf_map *map,  		return -ENOMEM;  	} +	f = fdget(ufd); /* bpf_map_do_batch() guarantees ufd is valid */  	for (cp = 0; cp < max_count; cp++) {  		err = -EFAULT;  		if (copy_from_user(key, keys + cp * map->key_size, @@ -1386,6 +1388,7 @@ int generic_map_update_batch(struct bpf_map *map,  	kvfree(value);  	kvfree(key); +	fdput(f);  	return err;  } |