]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 12 Jul 2025 14:44:51 +0000 (16:44 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 12 Jul 2025 14:44:51 +0000 (16:44 +0200)
added patches:
usb-gadget-u_serial-fix-race-condition-in-tty-wakeup.patch

queue-5.10/series
queue-5.10/usb-gadget-u_serial-fix-race-condition-in-tty-wakeup.patch [new file with mode: 0644]

index 964c892df190d07259fda6027098ec49c0b87ad3..c726b97d9848a5db5becd60d8c5e3c51900c3b1f 100644 (file)
@@ -185,3 +185,4 @@ x86-mce-don-t-remove-sysfs-if-thresholding-sysfs-init-fails.patch
 x86-mce-make-sure-cmci-banks-are-cleared-during-shutdown-on-intel.patch
 pinctrl-qcom-msm-mark-certain-pins-as-invalid-for-interrupts.patch
 drm-sched-increment-job-count-before-swapping-tail-spsc-queue.patch
+usb-gadget-u_serial-fix-race-condition-in-tty-wakeup.patch
diff --git a/queue-5.10/usb-gadget-u_serial-fix-race-condition-in-tty-wakeup.patch b/queue-5.10/usb-gadget-u_serial-fix-race-condition-in-tty-wakeup.patch
new file mode 100644 (file)
index 0000000..c42280b
--- /dev/null
@@ -0,0 +1,59 @@
+From c529c3730bd09115684644e26bf01ecbd7e2c2c9 Mon Sep 17 00:00:00 2001
+From: Kuen-Han Tsai <khtsai@google.com>
+Date: Tue, 17 Jun 2025 13:07:12 +0800
+Subject: usb: gadget: u_serial: Fix race condition in TTY wakeup
+
+From: Kuen-Han Tsai <khtsai@google.com>
+
+commit c529c3730bd09115684644e26bf01ecbd7e2c2c9 upstream.
+
+A race condition occurs when gs_start_io() calls either gs_start_rx() or
+gs_start_tx(), as those functions briefly drop the port_lock for
+usb_ep_queue(). This allows gs_close() and gserial_disconnect() to clear
+port.tty and port_usb, respectively.
+
+Use the null-safe TTY Port helper function to wake up TTY.
+
+Example
+  CPU1:                              CPU2:
+  gserial_connect() // lock
+                             gs_close() // await lock
+  gs_start_rx()     // unlock
+  usb_ep_queue()
+                             gs_close() // lock, reset port.tty and unlock
+  gs_start_rx()     // lock
+  tty_wakeup()      // NPE
+
+Fixes: 35f95fd7f234 ("TTY: usb/u_serial, use tty from tty_port")
+Cc: stable <stable@kernel.org>
+Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
+Reviewed-by: Prashanth K <prashanth.k@oss.qualcomm.com>
+Link: https://lore.kernel.org/linux-usb/20240116141801.396398-1-khtsai@google.com/
+Link: https://lore.kernel.org/r/20250617050844.1848232-2-khtsai@google.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/gadget/function/u_serial.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/usb/gadget/function/u_serial.c
++++ b/drivers/usb/gadget/function/u_serial.c
+@@ -292,8 +292,8 @@ __acquires(&port->port_lock)
+                       break;
+       }
+-      if (do_tty_wake && port->port.tty)
+-              tty_wakeup(port->port.tty);
++      if (do_tty_wake)
++              tty_port_tty_wakeup(&port->port);
+       return status;
+ }
+@@ -570,7 +570,7 @@ static int gs_start_io(struct gs_port *p
+               gs_start_tx(port);
+               /* Unblock any pending writes into our circular buffer, in case
+                * we didn't in gs_start_tx() */
+-              tty_wakeup(port->port.tty);
++              tty_port_tty_wakeup(&port->port);
+       } else {
+               /* Free reqs only if we are still connected */
+               if (port->port_usb) {