]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ntsync: Check wait count based on byte size.
authorElizabeth Figura <zfigura@codeweavers.com>
Thu, 20 Feb 2025 19:23:34 +0000 (13:23 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Feb 2025 10:57:33 +0000 (11:57 +0100)
GCC versions below 13 incorrectly detect the copy size as being static and too
small to fit in the "fds" array. Work around this by explicitly calculating the
size and returning EINVAL based on that, instead of based on the object count.

Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202502072019.LYoCR9bF-lkp@intel.com/
Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
--

Suggested-by as per Arnd's request, but the only thing I changed was preserving
array_size() [as noted by Geert in the linked thread]. I tested and found no
regressions.

v2: Add missing sign-off
Link: https://lore.kernel.org/r/20250220192334.549167-1-zfigura@codeweavers.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/ntsync.c

index 0b4e56d59b3daba2f95d7b87e6342d5b3b085447..999026a1ae0485763da7dbe8f263f83ca2fd01e5 100644 (file)
@@ -873,6 +873,7 @@ static int setup_wait(struct ntsync_device *dev,
 {
        int fds[NTSYNC_MAX_WAIT_COUNT + 1];
        const __u32 count = args->count;
+       size_t size = array_size(count, sizeof(fds[0]));
        struct ntsync_q *q;
        __u32 total_count;
        __u32 i, j;
@@ -880,15 +881,14 @@ static int setup_wait(struct ntsync_device *dev,
        if (args->pad || (args->flags & ~NTSYNC_WAIT_REALTIME))
                return -EINVAL;
 
-       if (args->count > NTSYNC_MAX_WAIT_COUNT)
+       if (size >= sizeof(fds))
                return -EINVAL;
 
        total_count = count;
        if (args->alert)
                total_count++;
 
-       if (copy_from_user(fds, u64_to_user_ptr(args->objs),
-                          array_size(count, sizeof(*fds))))
+       if (copy_from_user(fds, u64_to_user_ptr(args->objs), size))
                return -EFAULT;
        if (args->alert)
                fds[count] = args->alert;