Message ID | 153918036421.8915.10832039936335740025.stgit@kernel |
---|---|
State | Changes Requested, archived |
Delegated to: | BPF Maintainers |
Headers | show |
Series | Implement queue/stack maps | expand |
On Wed, Oct 10, 2018 at 7:06 AM Mauricio Vasquez B <mauricio.vasquez@polito.it> wrote: > > 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> > --- > kernel/bpf/syscall.c | 19 +++++++++++++++---- > 1 file changed, 15 insertions(+), 4 deletions(-) > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index 4f416234251f..f36c080ad356 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -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 > > @@ -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; > @@ -774,7 +785,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; > @@ -876,7 +887,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; > @@ -928,7 +939,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; >
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 4f416234251f..f36c080ad356 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -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 @@ -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; @@ -774,7 +785,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; @@ -876,7 +887,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; @@ -928,7 +939,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;
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> --- kernel/bpf/syscall.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)