Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp428993pxb; Wed, 3 Mar 2021 06:52:49 -0800 (PST) X-Google-Smtp-Source: ABdhPJwuvIAOO7U0JULvCC9jj8E/DNURVJMj21bdiqjerxDxVsW6elD2XPslakmTwRy7b0NygXvS X-Received: by 2002:a50:8a90:: with SMTP id j16mr25048893edj.334.1614783169251; Wed, 03 Mar 2021 06:52:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614783169; cv=none; d=google.com; s=arc-20160816; b=rCfi5qPbr8S4Z7d+CXA9BIq2SUbRTi2RZL5iD116NkEGUsNYYSn/Zzv9Ifwsaon58v Edi3Atgkz5IXqgRW4ybsWe0e7EJT2d4jJaFPquTzc95JCuWWUbPU8I0SZ43gROynAMBz EvN0HrubNiDOOFBOuV0oZbfp3gmYUO8kWFeTUtbaAxXqinewd5IplhBtqS67p9yNZxI6 Bdk249Hykax+vesEyEkx61JYrHpWr6M8atG1JXPo2xiuD/2vUtujgV+8lqoQcS2Mfc1D E+KATmbE+7xL2WfosG3bRHUzv3TPAGIcJWVXqXrDdi5YKM8CkQxTTwfPGIc9eYA0oLOk ayHA== 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=3ODsX5LX8CdSLdDFJnsPcmKFXb1V5+FOkYY7R/rV1ws=; b=Yq09y6UMoYyqXQLQHVkakSZXOh9g1O6msiom4660SxoehNDKqo2fJepC0/mD3U2e5l w8blwE/uQAQTlgGp9MEfSDrEhEfWCWqvTDQtxQAtNhHDBoQxOZfTa8fQ3ouSe4M/39+/ QNDBy0K+I3UVEhaBPzeTh7caS+HgybkGBK0HnGGq+OWhq89d9dCKLsy3bCAMYQoxGF6B l/4hMa2b+G5O+EEbpVcEl2cK9tOw7l3VSTj1CO4W8ORoePmM4GgjAX8QV5BaWTF8jX0+ mVIJCshAg7DHHBhtnVjrDvVJRVZilfnRbbgd0w+ayTYgjqY56V6CqlCG4h52c+FrRdvz qvSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=RcY7yoEL; 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 7si11000909edx.417.2021.03.03.06.51.24; Wed, 03 Mar 2021 06:52:49 -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=RcY7yoEL; 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 S244752AbhCAVxu (ORCPT + 99 others); Mon, 1 Mar 2021 16:53:50 -0500 Received: from mail.kernel.org ([198.145.29.99]:48874 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234286AbhCARYc (ORCPT ); Mon, 1 Mar 2021 12:24:32 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id CD8B06507D; Mon, 1 Mar 2021 16:50:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614617415; bh=Vf/mP1BLKmacIa0agHRI821sFIg0zv3CWRh5oIfZ7wY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RcY7yoEL/2BBvMYMuo3ilBKyCel1ksPLwjdoYqZugJORtgCnWEpZYzMkrvFyRHuxf 7wncigrdDyGsza+TxKrrkRFN0t8BSiLhQNDdwSj8v9o3sQhp3811TiujjQrt8Ks2iP ykf7J5RT8L8rTXg9iMKGGIBxo3A3oTACOF1eaP1I= 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.4 036/340] usb: gadget: u_audio: Free requests only after callback Date: Mon, 1 Mar 2021 17:09:40 +0100 Message-Id: <20210301161050.091326273@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210301161048.294656001@linuxfoundation.org> References: <20210301161048.294656001@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 56906d15fb551..223029fa84459 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