On Thu, Mar 06, 2025 at 04:49:42PM +0200, Mathias Nyman wrote: > From: Michal Pecio <michal.pecio@xxxxxxxxx> > > Up until commit d56b0b2ab142 ("usb: xhci: ensure skipped isoc TDs are > returned when isoc ring is stopped") in v6.11, the driver didn't skip > missed isochronous TDs when handling Stoppend and Stopped - Length > Invalid events. Instead, it erroneously cleared the skip flag, which > would cause the ring to get stuck, as future events won't match the > missed TD which is never removed from the queue until it's cancelled. > > This buggy logic seems to have been in place substantially unchanged > since the 3.x series over 10 years ago, which probably speaks first > and foremost about relative rarity of this case in normal usage, but > by the spec I see no reason why it shouldn't be possible. > > After d56b0b2ab142, TDs are immediately skipped when handling those > Stopped events. This poses a potential problem in case of Stopped - > Length Invalid, which occurs either on completed TDs (likely already > given back) or Link and No-Op TRBs. Such event won't be recognized > as matching any TD (unless it's the rare Link TRB inside a TD) and > will result in skipping all pending TDs, giving them back possibly > before they are done, risking isoc data loss and maybe UAF by HW. > > As a compromise, don't skip and don't clear the skip flag on this > kind of event. Then the next event will skip missed TDs. A downside > of not handling Stopped - Length Invalid on a Link inside a TD is > that if the TD is cancelled, its actual length will not be updated > to account for TRBs (silently) completed before the TD was stopped. > > I had no luck producing this sequence of completion events so there > is no compelling demonstration of any resulting disaster. It may be > a very rare, obscure condition. The sole motivation for this patch > is that if such unlikely event does occur, I'd rather risk reporting > a cancelled partially done isoc frame as empty than gamble with UAF. > > This will be fixed more properly by looking at Stopped event's TRB > pointer when making skipping decisions, but such rework is unlikely > to be backported to v6.12, which will stay around for a few years. > > Fixes: d56b0b2ab142 ("usb: xhci: ensure skipped isoc TDs are returned when isoc ring is stopped") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Michal Pecio <michal.pecio@xxxxxxxxx> > Signed-off-by: Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx> Why is a patch cc: stable burried here in a series for linux-next? It will be many many weeks before it gets out to anyone else, is that intentional? Same for the other commit in this series tagged that way. thanks, greg k-h