Skip to content

Commit

Permalink
bpf/syscall: allow key to be null in map functions
Browse files Browse the repository at this point in the history
This commit adds the required logic to allow key being NULL
in case the key_size of the map is 0.

A new __bpf_copy_key function helper only copies the key from
userpsace when key_size != 0, otherwise it enforces that key must be
null.

Signed-off-by: Mauricio Vasquez B <mauricio.vasquez@polito.it>
Acked-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
  • Loading branch information
Mauricio Vasquez B authored and Alexei Starovoitov committed Oct 19, 2018
1 parent 1449916 commit c9d29f4
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions kernel/bpf/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,17 @@ int __weak bpf_stackmap_copy(struct bpf_map *map, void *key, void *value)
return -ENOTSUPP;
}

static void *__bpf_copy_key(void __user *ukey, u64 key_size)
{
if (key_size)
return memdup_user(ukey, key_size);

if (ukey)
return ERR_PTR(-EINVAL);

return NULL;
}

/* last field in 'union bpf_attr' used by this command */
#define BPF_MAP_LOOKUP_ELEM_LAST_FIELD value

Expand Down Expand Up @@ -678,7 +689,7 @@ static int map_lookup_elem(union bpf_attr *attr)
goto err_put;
}

key = memdup_user(ukey, map->key_size);
key = __bpf_copy_key(ukey, map->key_size);
if (IS_ERR(key)) {
err = PTR_ERR(key);
goto err_put;
Expand Down Expand Up @@ -785,7 +796,7 @@ static int map_update_elem(union bpf_attr *attr)
goto err_put;
}

key = memdup_user(ukey, map->key_size);
key = __bpf_copy_key(ukey, map->key_size);
if (IS_ERR(key)) {
err = PTR_ERR(key);
goto err_put;
Expand Down Expand Up @@ -888,7 +899,7 @@ static int map_delete_elem(union bpf_attr *attr)
goto err_put;
}

key = memdup_user(ukey, map->key_size);
key = __bpf_copy_key(ukey, map->key_size);
if (IS_ERR(key)) {
err = PTR_ERR(key);
goto err_put;
Expand Down Expand Up @@ -941,7 +952,7 @@ static int map_get_next_key(union bpf_attr *attr)
}

if (ukey) {
key = memdup_user(ukey, map->key_size);
key = __bpf_copy_key(ukey, map->key_size);
if (IS_ERR(key)) {
err = PTR_ERR(key);
goto err_put;
Expand Down

0 comments on commit c9d29f4

Please sign in to comment.