drivers/fpga: use standard array-copy function
authorPhilipp Stanner <pstanner@redhat.com>
Tue, 14 Nov 2023 11:19:02 +0000 (12:19 +0100)
committerXu Yilun <yilun.xu@linux.intel.com>
Fri, 17 Nov 2023 08:34:26 +0000 (16:34 +0800)
dfl.c utilizes memdup_user() and array_size() to copy a userspace array.
array_size() will likely never trigger thanks to the preceding check.
Nevertheless, in the theoretical event that it would, it would return
SIZE_MAX to memdup_user(), resulting in an attempt to allocate huge
amounts of memory.

string.h from the core-api now provides memdup_array_user() which also
performs an overflow check and returns an error-pointer with -EOVERFLOW
to the caller.
As an additional advantage it standardizes how userspace-arrays are
being copied and, thus, makes it more obvious to readers that an array
is being copied.

Replace memdup_user() with memdup_array_user().

Suggested-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Acked-by: Xu Yilun <yilun.xu@intel.com>
Link: https://lore.kernel.org/r/20231114111901.19380-2-pstanner@redhat.com
Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
drivers/fpga/dfl.c

index dd7a783d53b5f4d865251ec34a3c390770c9c0a2..e69b9f1f2a50cb00cc7724e10943471f1c0d7d8a 100644 (file)
@@ -2008,8 +2008,8 @@ long dfl_feature_ioctl_set_irq(struct platform_device *pdev,
            (hdr.start + hdr.count < hdr.start))
                return -EINVAL;
 
-       fds = memdup_user((void __user *)(arg + sizeof(hdr)),
-                         array_size(hdr.count, sizeof(s32)));
+       fds = memdup_array_user((void __user *)(arg + sizeof(hdr)),
+                               hdr.count, sizeof(s32));
        if (IS_ERR(fds))
                return PTR_ERR(fds);