]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
usb: chaoskey: fix locking for O_NONBLOCK
authorOliver Neukum <oneukum@suse.com>
Thu, 30 Oct 2025 09:39:06 +0000 (10:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 19 Jan 2026 12:09:31 +0000 (13:09 +0100)
[ Upstream commit a2fa8a12e6bc9d89c0505b8dd7ae38ec173d25de ]

A failure to take a lock with O_NONBLOCK needs to result
in -EAGAIN. Change it.

Fixes: 66e3e591891da ("usb: Add driver for Altus Metrum ChaosKey device (v2)")
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Link: https://patch.msgid.link/20251030093918.2248104-1-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/usb/misc/chaoskey.c

index d99d424c05a7aac0133845ac4ae8147194981fd5..50909cc9a0bb2d8adb5a8a5450c07f9fd161fb41 100644 (file)
@@ -445,9 +445,19 @@ static ssize_t chaoskey_read(struct file *file,
                        goto bail;
                mutex_unlock(&dev->rng_lock);
 
-               result = mutex_lock_interruptible(&dev->lock);
-               if (result)
-                       goto bail;
+               if (file->f_flags & O_NONBLOCK) {
+                       result = mutex_trylock(&dev->lock);
+                       if (result == 0) {
+                               result = -EAGAIN;
+                               goto bail;
+                       } else {
+                               result = 0;
+                       }
+               } else {
+                       result = mutex_lock_interruptible(&dev->lock);
+                       if (result)
+                               goto bail;
+               }
                if (dev->valid == dev->used) {
                        result = _chaoskey_fill(dev);
                        if (result < 0) {