Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp384819pxb; Wed, 3 Mar 2021 05:54:16 -0800 (PST) X-Google-Smtp-Source: ABdhPJwn0zPS6BkFUAa5bTO7vAOWMh4QfhV0Ev2tkCPMkCS6dthgVI/ZGL3b93PpFvVFZw8ZytkH X-Received: by 2002:a17:906:380b:: with SMTP id v11mr26312010ejc.183.1614779656048; Wed, 03 Mar 2021 05:54:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614779656; cv=none; d=google.com; s=arc-20160816; b=saCS1GxJ4MInjXKnoyz5/46TrYWS6CU1sNkPIuAPqsiXudX4AFpnPpBqtgQ4yTwAeT wWNORFWXSc3uuwwUKJ8M9qT50TrrmuOLQHun71pv/y+OKwtUkgG26iqEeUYtB+ltxdWp GxBsnhkv/hZmkQ0img9GOCqRSDiv2HvYMfz9UlSPnDOiHerY5UcN6iHeMvKtOg4kCCRB VHrUQ2st+IVjUj86Ec79/jpeSJI4+21MTEKaNcpo9erDGU3t5vEoHgg3F4Ecv+HJrefG dDGPnwgqQ1FWqbWOA1eSEZaE6pDKD/pyoBrFT6piq+Q5FXDRjja5SbgaYY5Hg3PpNQYi KxSw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=4v0pVTcL/KxzyQcDEtvdwWM9IWAksvCLgEz8H4jPcyc=; b=Sqd4p0xSxw6i4oHO7C6BQ0ULh7+8pEkpJn3kTBeOqLm7yKB7dVqHIVo8qX3AMTBK0c kaNyxfI2qfMPsJ8Fkl+APkTdobhxKTr/yfzlF93jzv65W4CxIdaj6nGIfCGtNjJ7B01/ 1agCk4nDUX0313dEtQCDnWwpJzz4WYd/UEImTi5uUTflbnk2n6DydRSVisPaw+aAmwBD Pl6lM7ACLJawEM7e5mqc35wSuLZYu9ahD3yhK9s21DHN6FGILIVfzgjz5YN/2IvzbZ3E 3ToeRDhdEj2tuUZg0wsD9CtG53FvtCnpYaP7o0c2SFgU20VmrKIX++x7sh+pzsFl3TpV yieA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="eq/TxpDr"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gj9si10848327ejb.552.2021.03.03.05.53.38; Wed, 03 Mar 2021 05:54:16 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="eq/TxpDr"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239215AbhCAUCR (ORCPT + 99 others); Mon, 1 Mar 2021 15:02:17 -0500 Received: from mail.kernel.org ([198.145.29.99]:55952 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234898AbhCAQ6n (ORCPT ); Mon, 1 Mar 2021 11:58:43 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 747D064FE0; Mon, 1 Mar 2021 16:37:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614616632; bh=MrbIWZbNZwdaxrIrI0E4s1Fwq8D53RoLHd37QujM1hU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eq/TxpDrR/Zd75m9Am8TUXxORBy8Qk4YuKu+V8wVZQpTpTzygJnOIIHJuYTcNMVIH ybEyZVR/KHl3YtH7GYC459msUSYrnvONgv7rxDgCBsw8K0Y8jUBptuy46XXUgqugNC wv55FBZtEBzJV7+ch4B8Ljs0i2Tn4yNc8rD9bsG4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Felipe Balbi , Jack Pham , Jerome Brunet , Sasha Levin , Ferry Toth , Peter Chen Subject: [PATCH 4.19 042/247] usb: gadget: u_audio: Free requests only after callback Date: Mon, 1 Mar 2021 17:11:02 +0100 Message-Id: <20210301161033.730046010@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210301161031.684018251@linuxfoundation.org> References: <20210301161031.684018251@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jack Pham [ Upstream commit 7de8681be2cde9f6953d3be1fa6ce05f9fe6e637 ] As per the kernel doc for usb_ep_dequeue(), it states that "this routine is asynchronous, that is, it may return before the completion routine runs". And indeed since v5.0 the dwc3 gadget driver updated its behavior to place dequeued requests on to a cancelled list to be given back later after the endpoint is stopped. The free_ep() was incorrectly assuming that a request was ready to be freed after calling dequeue which results in a use-after-free in dwc3 when it traverses its cancelled list. Fix this by moving the usb_ep_free_request() call to the callback itself in case the ep is disabled. Fixes: eb9fecb9e69b0 ("usb: gadget: f_uac2: split out audio core") Reported-and-tested-by: Ferry Toth Reviewed-and-tested-by: Peter Chen Acked-by: Felipe Balbi Signed-off-by: Jack Pham Signed-off-by: Jerome Brunet Link: https://lore.kernel.org/r/20210118084642.322510-2-jbrunet@baylibre.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/gadget/function/u_audio.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c index fb5ed97572e5f..0cb0c638fd131 100644 --- a/drivers/usb/gadget/function/u_audio.c +++ b/drivers/usb/gadget/function/u_audio.c @@ -89,7 +89,12 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req) struct snd_uac_chip *uac = prm->uac; /* i/f shutting down */ - if (!prm->ep_enabled || req->status == -ESHUTDOWN) + if (!prm->ep_enabled) { + usb_ep_free_request(ep, req); + return; + } + + if (req->status == -ESHUTDOWN) return; /* @@ -351,8 +356,14 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep) for (i = 0; i < params->req_number; i++) { if (prm->ureq[i].req) { - usb_ep_dequeue(ep, prm->ureq[i].req); - usb_ep_free_request(ep, prm->ureq[i].req); + if (usb_ep_dequeue(ep, prm->ureq[i].req)) + usb_ep_free_request(ep, prm->ureq[i].req); + /* + * If usb_ep_dequeue() cannot successfully dequeue the + * request, the request will be freed by the completion + * callback. + */ + prm->ureq[i].req = NULL; } } -- 2.27.0