]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Revert "usb: yurex: Replace snprintf() with the safer scnprintf() variant"
authorOliver Neukum <oneukum@suse.com>
Mon, 7 Oct 2024 09:39:47 +0000 (11:39 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 7 Oct 2024 10:07:10 +0000 (12:07 +0200)
This reverts commit 86b20af11e84c26ae3fde4dcc4f490948e3f8035.

This patch leads to passing 0 to simple_read_from_buffer()
as a fifth argument, turning the read method into a nop.
The change is fundamentally flawed, as it breaks the driver.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
Cc: stable <stable@kernel.org>
Link: https://lore.kernel.org/r/20241007094004.242122-1-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/misc/yurex.c

index 4a9859e03f6b4cf3eaec0b64a3d90ede4086af31..7c12b937d0759c9f9b2da23300f8fe5cb06fc692 100644 (file)
@@ -34,8 +34,6 @@
 #define YUREX_BUF_SIZE         8
 #define YUREX_WRITE_TIMEOUT    (HZ*2)
 
-#define MAX_S64_STRLEN 20 /* {-}922337203685477580{7,8} */
-
 /* table of devices that work with this driver */
 static struct usb_device_id yurex_table[] = {
        { USB_DEVICE(YUREX_VENDOR_ID, YUREX_PRODUCT_ID) },
@@ -403,7 +401,8 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
 {
        struct usb_yurex *dev;
        int len = 0;
-       char in_buffer[MAX_S64_STRLEN];
+       char in_buffer[20];
+       unsigned long flags;
 
        dev = file->private_data;
 
@@ -413,16 +412,14 @@ static ssize_t yurex_read(struct file *file, char __user *buffer, size_t count,
                return -ENODEV;
        }
 
-       if (WARN_ON_ONCE(dev->bbu > S64_MAX || dev->bbu < S64_MIN)) {
-               mutex_unlock(&dev->io_mutex);
-               return -EIO;
-       }
-
-       spin_lock_irq(&dev->lock);
-       scnprintf(in_buffer, MAX_S64_STRLEN, "%lld\n", dev->bbu);
-       spin_unlock_irq(&dev->lock);
+       spin_lock_irqsave(&dev->lock, flags);
+       len = snprintf(in_buffer, 20, "%lld\n", dev->bbu);
+       spin_unlock_irqrestore(&dev->lock, flags);
        mutex_unlock(&dev->io_mutex);
 
+       if (WARN_ON_ONCE(len >= sizeof(in_buffer)))
+               return -EIO;
+
        return simple_read_from_buffer(buffer, count, ppos, in_buffer, len);
 }