]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
USB: usbtmc: use interruptible sleep in usbtmc_read
authorOliver Neukum <oneukum@suse.com>
Wed, 30 Apr 2025 13:48:10 +0000 (15:48 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 18 May 2025 06:24:09 +0000 (08:24 +0200)
commit 054c5145540e5ad5b80adf23a5e3e2fc281fb8aa upstream.

usbtmc_read() calls usbtmc_generic_read()
which uses interruptible sleep, but usbtmc_read()
itself uses uninterruptble sleep for mutual exclusion
between threads. That makes no sense.
Both should use interruptible sleep.

Fixes: 5b775f672cc99 ("USB: add USB test and measurement class driver")
Cc: stable <stable@kernel.org>
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Link: https://lore.kernel.org/r/20250430134810.226015-1-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/class/usbtmc.c

index c2e666e82857c137b4b489f3c88a9389e26f5da0..e483832b8d3a101ca1893a30f2f4b9fbba14ae63 100644 (file)
@@ -1380,7 +1380,10 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf,
        if (!buffer)
                return -ENOMEM;
 
-       mutex_lock(&data->io_mutex);
+       retval = mutex_lock_interruptible(&data->io_mutex);
+       if (retval < 0)
+               goto exit_nolock;
+
        if (data->zombie) {
                retval = -ENODEV;
                goto exit;
@@ -1503,6 +1506,7 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf,
 
 exit:
        mutex_unlock(&data->io_mutex);
+exit_nolock:
        kfree(buffer);
        return retval;
 }