bpf: don't open-code memdup_user()
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 13 May 2017 22:43:00 +0000 (18:43 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 30 Jun 2017 06:04:11 +0000 (02:04 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
kernel/bpf/syscall.c

index fd2411fd69148cff375120316fba0a0e033541f6..4b8b10bddfdeeb24d78fe18bfbfb8304b8c00d9d 100644 (file)
@@ -322,14 +322,11 @@ static int map_lookup_elem(union bpf_attr *attr)
        if (IS_ERR(map))
                return PTR_ERR(map);
 
-       err = -ENOMEM;
-       key = kmalloc(map->key_size, GFP_USER);
-       if (!key)
+       key = memdup_user(ukey, map->key_size);
+       if (IS_ERR(key)) {
+               err = PTR_ERR(key);
                goto err_put;
-
-       err = -EFAULT;
-       if (copy_from_user(key, ukey, map->key_size) != 0)
-               goto free_key;
+       }
 
        if (map->map_type == BPF_MAP_TYPE_PERCPU_HASH ||
            map->map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH ||
@@ -402,14 +399,11 @@ static int map_update_elem(union bpf_attr *attr)
        if (IS_ERR(map))
                return PTR_ERR(map);
 
-       err = -ENOMEM;
-       key = kmalloc(map->key_size, GFP_USER);
-       if (!key)
+       key = memdup_user(ukey, map->key_size);
+       if (IS_ERR(key)) {
+               err = PTR_ERR(key);
                goto err_put;
-
-       err = -EFAULT;
-       if (copy_from_user(key, ukey, map->key_size) != 0)
-               goto free_key;
+       }
 
        if (map->map_type == BPF_MAP_TYPE_PERCPU_HASH ||
            map->map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH ||
@@ -488,14 +482,11 @@ static int map_delete_elem(union bpf_attr *attr)
        if (IS_ERR(map))
                return PTR_ERR(map);
 
-       err = -ENOMEM;
-       key = kmalloc(map->key_size, GFP_USER);
-       if (!key)
+       key = memdup_user(ukey, map->key_size);
+       if (IS_ERR(key)) {
+               err = PTR_ERR(key);
                goto err_put;
-
-       err = -EFAULT;
-       if (copy_from_user(key, ukey, map->key_size) != 0)
-               goto free_key;
+       }
 
        preempt_disable();
        __this_cpu_inc(bpf_prog_active);
@@ -507,7 +498,6 @@ static int map_delete_elem(union bpf_attr *attr)
 
        if (!err)
                trace_bpf_map_delete_elem(map, ufd, key);
-free_key:
        kfree(key);
 err_put:
        fdput(f);
@@ -536,14 +526,11 @@ static int map_get_next_key(union bpf_attr *attr)
                return PTR_ERR(map);
 
        if (ukey) {
-               err = -ENOMEM;
-               key = kmalloc(map->key_size, GFP_USER);
-               if (!key)
+               key = memdup_user(ukey, map->key_size);
+               if (IS_ERR(key)) {
+                       err = PTR_ERR(key);
                        goto err_put;
-
-               err = -EFAULT;
-               if (copy_from_user(key, ukey, map->key_size) != 0)
-                       goto free_key;
+               }
        } else {
                key = NULL;
        }