All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathias Nyman <mathias.nyman@linux.intel.com>
To: <gregkh@linuxfoundation.org>
Cc: <linux-usb@vger.kernel.org>,
	Mathias Nyman <mathias.nyman@linux.intel.com>,
	Kuen-Han Tsai <khtsai@google.com>
Subject: [PATCH 19/19] xhci: fix possible null pointer deref during xhci urb enqueue
Date: Fri,  1 Dec 2023 17:06:47 +0200	[thread overview]
Message-ID: <20231201150647.1307406-20-mathias.nyman@linux.intel.com> (raw)
In-Reply-To: <20231201150647.1307406-1-mathias.nyman@linux.intel.com>

There is a short gap between urb being submitted and actually added to the
endpoint queue (linked). If the device is disconnected during this time
then usb core is not yet aware of the pending urb, and device may be freed
just before xhci_urq_enqueue() continues, dereferencing the freed device.

Freeing the device is protected by the xhci spinlock, so make sure we take
and keep the lock while checking that device exists, dereference it, and
add the urb to the queue.

Remove the unnecessary URB check, usb core checks it before calling
xhci_urb_enqueue()

Suggested-by: Kuen-Han Tsai <khtsai@google.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
---
 drivers/usb/host/xhci.c | 40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index df31d44498d6..4929c4396e9e 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -1521,24 +1521,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
 	struct urb_priv	*urb_priv;
 	int num_tds;
 
-	if (!urb)
-		return -EINVAL;
-	ret = xhci_check_args(hcd, urb->dev, urb->ep,
-					true, true, __func__);
-	if (ret <= 0)
-		return ret ? ret : -EINVAL;
-
-	slot_id = urb->dev->slot_id;
 	ep_index = xhci_get_endpoint_index(&urb->ep->desc);
-	ep_state = &xhci->devs[slot_id]->eps[ep_index].ep_state;
-
-	if (!HCD_HW_ACCESSIBLE(hcd))
-		return -ESHUTDOWN;
-
-	if (xhci->devs[slot_id]->flags & VDEV_PORT_ERROR) {
-		xhci_dbg(xhci, "Can't queue urb, port error, link inactive\n");
-		return -ENODEV;
-	}
 
 	if (usb_endpoint_xfer_isoc(&urb->ep->desc))
 		num_tds = urb->number_of_packets;
@@ -1562,12 +1545,35 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
 
 	spin_lock_irqsave(&xhci->lock, flags);
 
+	ret = xhci_check_args(hcd, urb->dev, urb->ep,
+			      true, true, __func__);
+	if (ret <= 0) {
+		ret = ret ? ret : -EINVAL;
+		goto free_priv;
+	}
+
+	slot_id = urb->dev->slot_id;
+
+	if (!HCD_HW_ACCESSIBLE(hcd)) {
+		ret = -ESHUTDOWN;
+		goto free_priv;
+	}
+
+	if (xhci->devs[slot_id]->flags & VDEV_PORT_ERROR) {
+		xhci_dbg(xhci, "Can't queue urb, port error, link inactive\n");
+		ret = -ENODEV;
+		goto free_priv;
+	}
+
 	if (xhci->xhc_state & XHCI_STATE_DYING) {
 		xhci_dbg(xhci, "Ep 0x%x: URB %p submitted for non-responsive xHCI host.\n",
 			 urb->ep->desc.bEndpointAddress, urb);
 		ret = -ESHUTDOWN;
 		goto free_priv;
 	}
+
+	ep_state = &xhci->devs[slot_id]->eps[ep_index].ep_state;
+
 	if (*ep_state & (EP_GETTING_STREAMS | EP_GETTING_NO_STREAMS)) {
 		xhci_warn(xhci, "WARN: Can't enqueue URB, ep in streams transition state %x\n",
 			  *ep_state);
-- 
2.25.1


      parent reply	other threads:[~2023-12-01 15:06 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-01 15:06 [PATCH 00/19] xhci features for usb-next Mathias Nyman
2023-12-01 15:06 ` [PATCH 01/19] xhci: dbc: Drop duplicate checks for dma_free_coherent() Mathias Nyman
2023-12-01 15:06 ` [PATCH 02/19] xhci: dbc: Convert to use sysfs_streq() Mathias Nyman
2023-12-01 15:06 ` [PATCH 03/19] xhci: dbc: Use sysfs_emit() to instead of scnprintf() Mathias Nyman
2023-12-01 15:06 ` [PATCH 04/19] xhci: dbc: Use ATTRIBUTE_GROUPS() Mathias Nyman
2023-12-01 15:06 ` [PATCH 05/19] xhci: dbc: Check for errors first in xhci_dbc_stop() Mathias Nyman
2023-12-01 15:06 ` [PATCH 06/19] xhci: dbc: Don't shadow error codes in store() functions Mathias Nyman
2023-12-01 15:06 ` [PATCH 07/19] xhci: dbc: Replace custom return value with proper Linux error code Mathias Nyman
2023-12-01 15:06 ` [PATCH 08/19] xhci: dbc: Use sizeof_field() where it makes sense Mathias Nyman
2023-12-01 17:31   ` David Laight
2023-12-01 19:08     ` Andy Shevchenko
2023-12-02 15:50       ` David Laight
2023-12-04 10:23         ` Mathias Nyman
2023-12-04 10:45           ` David Laight
2023-12-01 15:06 ` [PATCH 09/19] xhci: dbc: Use sizeof(*pointer) instead of sizeof(type) Mathias Nyman
2023-12-01 15:06 ` [PATCH 10/19] xhci: dbc: Add missing headers Mathias Nyman
2023-12-01 15:06 ` [PATCH 11/19] xhci: check if legacy irq is available before using it as fallback Mathias Nyman
2023-12-01 15:06 ` [PATCH 12/19] xhci: add handler for only one interrupt line Mathias Nyman
2023-12-01 15:06 ` [PATCH 13/19] xhci: refactor static MSI-X function Mathias Nyman
2023-12-01 15:06 ` [PATCH 14/19] xhci: refactor static MSI function Mathias Nyman
2023-12-01 15:06 ` [PATCH 15/19] xhci: change 'msix_count' to encompass MSI or MSI-X vectors Mathias Nyman
2023-12-01 15:06 ` [PATCH 16/19] xhci: rework 'xhci_try_enable_msi()' MSI and MSI-X setup code Mathias Nyman
2023-12-01 15:06 ` [PATCH 17/19] xhci: minor coding style cleanup in 'xhci_try_enable_msi()' Mathias Nyman
2023-12-01 15:06 ` [PATCH 18/19] xhci: Reconfigure endpoint 0 max packet size only during endpoint reset Mathias Nyman
2023-12-01 15:06 ` Mathias Nyman [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231201150647.1307406-20-mathias.nyman@linux.intel.com \
    --to=mathias.nyman@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=khtsai@google.com \
    --cc=linux-usb@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.