FAILED: patch "[PATCH] usb: free iso schedules on failed submit" failed to apply to 6.1-stable tree
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x b9399d25fbb34a05bbe76eeedd730f62ff2670e9
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026071433-debating-yonder-99d6@gregkh' --subject-prefix 'PATCH 6.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b9399d25fbb34a05bbe76eeedd730f62ff2670e9 Mon Sep 17 00:00:00 2001
From: Dawei Feng <[email protected]>
Date: Tue, 30 Jun 2026 15:14:19 +0800
Subject: [PATCH] usb: free iso schedules on failed submit
EHCI and FOTG210 isochronous submits build an ehci_iso_sched before linking the URB to the endpoint queue, and keep the staged schedule in urb->hcpriv until iso_stream_schedule() and the link helpers consume it. If the controller is no longer accessible, or usb_hcd_link_urb_to_ep() fails, submit jumps to done_not_linked before that handoff happens and leaks the staged schedule still attached to urb->hcpriv.
Free the staged schedule from done_not_linked when submit fails before the URB is linked and clear urb->hcpriv after the free.
The bug was first flagged by an experimental analysis tool we are developing for kernel memory-management bugs while analyzing v6.13-rc1. The tool is still under development and is not yet publicly available. Manual inspection confirms that the bug is still present in v7.1.1.
An x86_64 allyesconfig build showed no new warnings. As we do not have an EHCI host controller with a USB isochronous device to test with, no runtime testing was able to be performed.
drivers/usb/fotg210/fotg210-hcd.c +4 -2
@@ -4267,8 +4267,6 @@ static int iso_stream_schedule(struct fotg210_hcd *fotg210, struct urb *urb,return 0 ; fail: -iso_sched_free (stream, sched); - urb->hcpriv =NULL ;return status; }
@@ -4562,6 +4560,10 @@ static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb,else usb_hcd_unlink_urb_from_ep (fotg210_to_hcd (fotg210), urb); done_not_linked: +if (status <0 ) { +iso_sched_free (stream, urb->hcpriv); + urb->hcpriv =NULL ; + }spin_unlock_irqrestore (&fotg210->lock, flags); done:return status;
drivers/usb/host/ehci-sched.c +9 -2
@@ -1623,6 +1623,7 @@ iso_stream_schedule( status =1 ;/* and give it back immediately */ iso_sched_free (stream, sched); sched =NULL ; + urb->hcpriv =NULL ; } } urb->error_count = skip / period;
@@ -1653,8 +1654,6 @@ iso_stream_schedule(return status; fail: -iso_sched_free (stream, sched); - urb->hcpriv =NULL ;return status; }
@@ -1966,6 +1965,10 @@ static int itd_submit(struct ehci_hcd *ehci, struct urb *urb,usb_hcd_unlink_urb_from_ep (ehci_to_hcd (ehci), urb); } done_not_linked: +if (status <0 ) { +iso_sched_free (stream, urb->hcpriv); + urb->hcpriv =NULL ; + }spin_unlock_irqrestore (&ehci->lock, flags); done:return status;
@@ -2343,6 +2346,10 @@ static int sitd_submit(struct ehci_hcd *ehci, struct urb *urb,usb_hcd_unlink_urb_from_ep (ehci_to_hcd (ehci), urb); } done_not_linked: +if (status <0 ) { +iso_sched_free (stream, urb->hcpriv); + urb->hcpriv =NULL ; + }spin_unlock_irqrestore (&ehci->lock, flags); done:return status;
Sasha Levin
maintainerPATCH 1/1 usb: free iso schedules on failed submit
From: Dawei Feng <[email protected]>
[ Upstream commit b9399d25fbb34a05bbe76eeedd730f62ff2670e9 ]
EHCI and FOTG210 isochronous submits build an ehci_iso_sched before linking the URB to the endpoint queue, and keep the staged schedule in urb->hcpriv until iso_stream_schedule() and the link helpers consume it. If the controller is no longer accessible, or usb_hcd_link_urb_to_ep() fails, submit jumps to done_not_linked before that handoff happens and leaks the staged schedule still attached to urb->hcpriv.
Free the staged schedule from done_not_linked when submit fails before the URB is linked and clear urb->hcpriv after the free.
The bug was first flagged by an experimental analysis tool we are developing for kernel memory-management bugs while analyzing v6.13-rc1. The tool is still under development and is not yet publicly available. Manual inspection confirms that the bug is still present in v7.1.1.
An x86_64 allyesconfig build showed no new warnings. As we do not have an EHCI host controller with a USB isochronous device to test with, no runtime testing was able to be performed.
--- drivers/usb/host/ehci-sched.c | 11 +++++++++-- drivers/usb/host/fotg210-hcd.c | 6 ++++-- 2 files changed, 13 insertions(+), 4 deletions(-)
drivers/usb/host/ehci-sched.c +9 -2
@@ -1623,6 +1623,7 @@ iso_stream_schedule( status =1 ;/* and give it back immediately */ iso_sched_free (stream, sched); sched =NULL ; + urb->hcpriv =NULL ; } } urb->error_count = skip / period;
@@ -1653,8 +1654,6 @@ iso_stream_schedule(return status; fail: -iso_sched_free (stream, sched); - urb->hcpriv =NULL ;return status; }
@@ -1966,6 +1965,10 @@ static int itd_submit(struct ehci_hcd *ehci, struct urb *urb,usb_hcd_unlink_urb_from_ep (ehci_to_hcd (ehci), urb); } done_not_linked: +if (status <0 ) { +iso_sched_free (stream, urb->hcpriv); + urb->hcpriv =NULL ; + }spin_unlock_irqrestore (&ehci->lock, flags); done:return status;
@@ -2343,6 +2346,10 @@ static int sitd_submit(struct ehci_hcd *ehci, struct urb *urb,usb_hcd_unlink_urb_from_ep (ehci_to_hcd (ehci), urb); } done_not_linked: +if (status <0 ) { +iso_sched_free (stream, urb->hcpriv); + urb->hcpriv =NULL ; + }spin_unlock_irqrestore (&ehci->lock, flags); done:return status;
drivers/usb/host/fotg210-hcd.c +4 -2
@@ -4272,8 +4272,6 @@ static int iso_stream_schedule(struct fotg210_hcd *fotg210, struct urb *urb,return 0 ; fail: -iso_sched_free (stream, sched); - urb->hcpriv =NULL ;return status; }
@@ -4567,6 +4565,10 @@ static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb,else usb_hcd_unlink_urb_from_ep (fotg210_to_hcd (fotg210), urb); done_not_linked: +if (status <0 ) { +iso_sched_free (stream, urb->hcpriv); + urb->hcpriv =NULL ; + }spin_unlock_irqrestore (&fotg210->lock, flags); done:return status;
Signature · 1 line
2.53.0