fs/nilfs2: use standard array-copy-function
authorPhilipp Stanner <pstanner@redhat.com>
Mon, 6 Nov 2023 22:44:16 +0000 (07:44 +0900)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 11 Dec 2023 01:21:25 +0000 (17:21 -0800)
ioctl.c utilizes memdup_user() to copy a userspace array.  An overflow
check is performed manually before the function's invocation.

The new function memdup_array_user() standardizes copying userspace
arrays, thus, improving readability by making it more clear that an array
is being copied.  Additionally, it also performs an overflow check.

Remove the (now redundant) manual overflow-check and replace memdup_user()
with memdup_array_user().

In addition, improve the grammar of the comment above
memdup_array_user().

Link: https://lkml.kernel.org/r/20231106224416.3055-1-konishi.ryusuke@gmail.com
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Link: https://lkml.kernel.org/r/20231103184831.99406-2-pstanner@redhat.com
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Suggested-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/nilfs2/ioctl.c

index 40ffade49f389a2b6a48226c7be74b89bc6c2c7c..cfb6aca5ec383020b6d05c712d03b49bf6218b26 100644 (file)
@@ -872,16 +872,14 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp,
        nsegs = argv[4].v_nmembs;
        if (argv[4].v_size != argsz[4])
                goto out;
-       if (nsegs > UINT_MAX / sizeof(__u64))
-               goto out;
 
        /*
         * argv[4] points to segment numbers this ioctl cleans.  We
-        * use kmalloc() for its buffer because memory used for the
-        * segment numbers is enough small.
+        * use kmalloc() for its buffer because the memory used for the
+        * segment numbers is small enough.
         */
-       kbufs[4] = memdup_user((void __user *)(unsigned long)argv[4].v_base,
-                              nsegs * sizeof(__u64));
+       kbufs[4] = memdup_array_user((void __user *)(unsigned long)argv[4].v_base,
+                                    nsegs, sizeof(__u64));
        if (IS_ERR(kbufs[4])) {
                ret = PTR_ERR(kbufs[4]);
                goto out;