From: Greg Kroah-Hartman Date: Sat, 12 Jul 2025 14:44:51 +0000 (+0200) Subject: 5.10-stable patches X-Git-Tag: v5.15.188~49 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=440ffc851fe302203e684b22785c28f0744b243b;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: usb-gadget-u_serial-fix-race-condition-in-tty-wakeup.patch --- diff --git a/queue-5.10/series b/queue-5.10/series index 964c892df1..c726b97d98 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -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 index 0000000000..c42280bb32 --- /dev/null +++ b/queue-5.10/usb-gadget-u_serial-fix-race-condition-in-tty-wakeup.patch @@ -0,0 +1,59 @@ +From c529c3730bd09115684644e26bf01ecbd7e2c2c9 Mon Sep 17 00:00:00 2001 +From: Kuen-Han Tsai +Date: Tue, 17 Jun 2025 13:07:12 +0800 +Subject: usb: gadget: u_serial: Fix race condition in TTY wakeup + +From: Kuen-Han Tsai + +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 +Signed-off-by: Kuen-Han Tsai +Reviewed-by: Prashanth K +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 +--- + 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) {