bpf: fix integer overflow in queue_stack_map
Subsystems (3)
Alexei Starovoitov
maintainerPATCH 1/1 bpf: fix integer overflow in queue_stack_map
fix the following issues:
- allow queue_stack_map for root only
- fix u32 max_entries overflow
- disallow value_size == 0
Reported-by Wei Wu <[email protected]>
Fixes f1a2e44a3aec ("bpf: add queue and stack maps")
Signed-off-by Alexei Starovoitov <[email protected]>
--- kernel/bpf/queue_stack_maps.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
kernel/bpf/queue_stack_maps.c +8 -8
@@ -7,6 +7,7 @@#include <linux/bpf.h> #include <linux/list.h> #include <linux/slab.h> +#include <linux/capability.h> #include "percpu_freelist.h" #define QUEUE_STACK_CREATE_FLAG_MASK \
@@ -45,8 +46,12 @@ static bool queue_stack_map_is_full(struct bpf_queue_stack *qs)/* Called from syscall */ static int queue_stack_map_alloc_check (union bpf_attr *attr) { +if (!capable (CAP_SYS_ADMIN )) +return -EPERM ; +/* check sanity of attributes */ if (attr->max_entries ==0 || attr->key_size !=0 || + attr->value_size ==0 || attr->map_flags & ~QUEUE_STACK_CREATE_FLAG_MASK )return -EINVAL ;
@@ -63,15 +68,10 @@ static struct bpf_map *queue_stack_map_alloc(union bpf_attr *attr) {int ret, numa_node =bpf_map_attr_numa_node (attr);struct bpf_queue_stack *qs; -u32 size, value_size; -u64 queue_size, cost; - - size = attr->max_entries +1 ; - value_size = attr->value_size; - - queue_size =sizeof (*qs) + (u64 ) value_size * size; +u64 size, queue_size, cost; - cost = queue_size; + size = (u64 ) attr->max_entries +1 ; + cost = queue_size =sizeof (*qs) + size * attr->value_size;if (cost >=U32_MAX -PAGE_SIZE )return ERR_PTR (-E2BIG );
Signature · 1 line
2.17.1
Quoted 8 lines · Alexei Starovoitov
fix the following issues:
- allowqueue_stack_mapfor root only
- fix u32max_entriesoverflow
- disallowvalue_size== 0Reported-by Wei Wu <[email protected]>Fixes f1a2e44a3aec ("bpf: add queue and stack maps")Signed-off-by Alexei Starovoitov <[email protected]>
Applied, thanks everyone!