diff options
Diffstat (limited to 'kernel/bpf/devmap.c')
| -rw-r--r-- | kernel/bpf/devmap.c | 11 | 
1 files changed, 6 insertions, 5 deletions
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index a936c704d4e7..4e2cdbb5629f 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -130,13 +130,14 @@ static int dev_map_init_map(struct bpf_dtab *dtab, union bpf_attr *attr)  	bpf_map_init_from_attr(&dtab->map, attr);  	if (attr->map_type == BPF_MAP_TYPE_DEVMAP_HASH) { -		dtab->n_buckets = roundup_pow_of_two(dtab->map.max_entries); - -		if (!dtab->n_buckets) /* Overflow check */ +		/* hash table size must be power of 2; roundup_pow_of_two() can +		 * overflow into UB on 32-bit arches, so check that first +		 */ +		if (dtab->map.max_entries > 1UL << 31)  			return -EINVAL; -	} -	if (attr->map_type == BPF_MAP_TYPE_DEVMAP_HASH) { +		dtab->n_buckets = roundup_pow_of_two(dtab->map.max_entries); +  		dtab->dev_index_head = dev_map_create_hash(dtab->n_buckets,  							   dtab->map.numa_node);  		if (!dtab->dev_index_head)  | 
