mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
xhci: Fix NULL pointer dereference when cleaning up streams for removed host
commit 4b895868bb upstream.
This off by one in stream_id indexing caused NULL pointer dereference and
soft lockup on machines with USB attached SCSI devices connected to a
hotpluggable xhci controller.
The code that cleans up pending URBs for dead hosts tried to dereference
a stream ring at the invalid stream_id 0.
ep->stream_info->stream_rings[0] doesn't point to a ring.
Start looping stream_id from 1 like in all the other places in the driver,
and check that the ring exists before trying to kill URBs on it.
Reported-by: rocko r <rockorequin@gmail.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
09364c783c
commit
f883b509b4
@@ -856,13 +856,16 @@ static void xhci_kill_endpoint_urbs(struct xhci_hcd *xhci,
|
||||
(ep->ep_state & EP_GETTING_NO_STREAMS)) {
|
||||
int stream_id;
|
||||
|
||||
for (stream_id = 0; stream_id < ep->stream_info->num_streams;
|
||||
for (stream_id = 1; stream_id < ep->stream_info->num_streams;
|
||||
stream_id++) {
|
||||
ring = ep->stream_info->stream_rings[stream_id];
|
||||
if (!ring)
|
||||
continue;
|
||||
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb,
|
||||
"Killing URBs for slot ID %u, ep index %u, stream %u",
|
||||
slot_id, ep_index, stream_id + 1);
|
||||
xhci_kill_ring_urbs(xhci,
|
||||
ep->stream_info->stream_rings[stream_id]);
|
||||
slot_id, ep_index, stream_id);
|
||||
xhci_kill_ring_urbs(xhci, ring);
|
||||
}
|
||||
} else {
|
||||
ring = ep->ring;
|
||||
|
||||
Reference in New Issue
Block a user