Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3991747pxb; Tue, 2 Mar 2021 04:06:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJy0JTzlGRxhaiyuH5mM+oLEG343bRMY4WpYLVwFQ8XGVNUsdGgJ2UGFnbmk/97PPVN+LfpT X-Received: by 2002:aa7:cc03:: with SMTP id q3mr20634655edt.366.1614686694382; Tue, 02 Mar 2021 04:04:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614686694; cv=none; d=google.com; s=arc-20160816; b=kryLzJoVD0FoAJvqDaZxGfPTnrk25I2QXy4msj8DifsJyd71XVQ/XZo3A/Op48gv3P omt1zttOjiG0ubXRFF8ZNAyewGTVkbGR7+hsRnVsOnnpm108heafuuNWiOElthmLWguw gYj4lEN+EEL6Y4ue4uaHtc84dBVnpsAVz1Yee7S6dS+H8bfsUA363eMyYiK+lSok3gxG /Y+ghknP0xEYef7qmUZf6fHH06o1pf3XSmbKS2AljMhosLGMkYAoLDuj/8xVIomc5qAz yzGs9rk6Ik1sX1UUYwqxW/Z9N5n/wQF9haenhPe2YICj3+pyuTD0g8vqiZyUEHp3iFor uhPg== 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=bPURG6hYYtif4lYJHDBW40k8JhKh3R5i1Ccu2xeebEI=; b=lJpnoxTebTzfpdeSvlWdwcPCrInU7o/2J+8rJcIsyZiOBRuhvxBWRVwH2Jdb0Z1y8D f5B1ztugITS73vpscGdLQQDNJpY0n5QXmKtG4jA8JlJo2MNbUIWIOyReJOyjQvIqdIuU Mg44r6R7A8vjl4uzaNNEjEo6Y2D+73ooe9W5m7woVyIDhDj3kLEUAmtjQpRvGUaiE7VK CjC6fyY3F+G1JMWTE496mnTRNUIqadq7e2jUoFkbom9cCwDDdoxeERUOmZ29RBBHGqYE +69UCgH74zR0RzV8rlkoiKIGwLrvZIs/IMbrHtP2VxV2a5RGZ/Rwb8gSHa25rxzhpIqn /tqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=EDcjJWcI; 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 l23si5651553ejq.537.2021.03.02.04.04.30; Tue, 02 Mar 2021 04:04:54 -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=EDcjJWcI; 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 S1442406AbhCBCNK (ORCPT + 99 others); Mon, 1 Mar 2021 21:13:10 -0500 Received: from mail.kernel.org ([198.145.29.99]:53024 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241735AbhCATix (ORCPT ); Mon, 1 Mar 2021 14:38:53 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 501206515C; Mon, 1 Mar 2021 17:05:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614618348; bh=f9pXglcwnjOnwPKby6RWGzMmgytNP6MOjK/rl95E5J4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EDcjJWcIuBf1dMFA3T4XR/7rBT8mFIDGfqTGJguMJwrge66laEr5a4Issmo6GUWAp dR3w+NESQiY/tULyyYOGJ19B9YKLu4qAX9IwtWLD96yYAyOmhY1WZCUJXmH2myurXS d3P2hEzf3XuNaY4AnT8X/tHsKLiBgnJCkp/bPHus= 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 5.10 054/663] usb: gadget: u_audio: Free requests only after callback Date: Mon, 1 Mar 2021 17:05:02 +0100 Message-Id: <20210301161144.439581242@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210301161141.760350206@linuxfoundation.org> References: <20210301161141.760350206@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 e6d32c5367812..908e49dafd620 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; /* @@ -336,8 +341,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