Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp827438pxu; Wed, 6 Jan 2021 05:39:44 -0800 (PST) X-Google-Smtp-Source: ABdhPJz3a6v7cqxFXyxIFzLHyAWxrD2+Wdg1qVSzM/m8Gq7ZealOJ0BqecBlnYSucg/PKXRrlBxq X-Received: by 2002:a17:907:c15:: with SMTP id ga21mr2950269ejc.472.1609940384492; Wed, 06 Jan 2021 05:39:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609940384; cv=none; d=google.com; s=arc-20160816; b=IQkA4og4cQzqiCm9zad7KOoRFJvNCXJUsGvzv+n9dB1znxXg3FJV3JvacrNAeVSNk3 KRfWwzm38dU+iP9l4Ze9KO7XVO476OwcG+vN6xnew5tNTruQT5JFKwncvLuKD4rltJpM WlLwieqtcvzIFOJtMwKPh7ixyRUMoQcfvc0hs60+j74BWDu7XFAvgjtWp3VSFi0/ywKI EVyIH6YoDNrtE9FMlX9qsMHLIbX1JQpODU02cjTS4SSMgyjJGm/wLfVMUUWWkHQxxZLw jcxFAqdMcFz2JL+Rq5uN3c5DTgh9LJ5dJAOOccAhHb2av1MsRcoGb7mDFVGNHTjob7fw 94SA== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=mTKp7Q6ON2dW5g8WxlLxPPWuU/dM5NtfKl7JdpUhkyQ=; b=ofbNtHxJP4IBhVoExmPHdelfpTsVJQJ2dJPbkdYakAvba+xdEVqmox+Yg6ulHS3+Gu r5l3fn+x3D+HPqCNplEqZRaXY/OWtj0QdR8ChHuA4V1LHAee7lywrRV08O1iTlU4oSA4 Yuk4xVrPd6nH7rV6M/ppEpvLYpNmeNMtO4kQlMO3ueXFZrw81X2sIm9/xxt2j562ZLN+ +vNMtSxLXc7nMm20IYfd0RjUmeMMjryD2UPpxRP50NKrF1LOVSz2Mdw8vrTTnjikGiP6 17KKfPuGtz4DEaMJAdmawPtgHm7Y5kxMGUnGn6UwvM+WTWtLjbW+nqdOXrvOmckjrAes Xtig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=tg7dAOXk; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dp16si976334ejc.625.2021.01.06.05.39.19; Wed, 06 Jan 2021 05:39:44 -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=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=tg7dAOXk; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726832AbhAFNhu (ORCPT + 99 others); Wed, 6 Jan 2021 08:37:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48826 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726803AbhAFNhs (ORCPT ); Wed, 6 Jan 2021 08:37:48 -0500 Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D266C061358 for ; Wed, 6 Jan 2021 05:37:08 -0800 (PST) Received: by mail-ed1-x52f.google.com with SMTP id g24so4368874edw.9 for ; Wed, 06 Jan 2021 05:37:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mTKp7Q6ON2dW5g8WxlLxPPWuU/dM5NtfKl7JdpUhkyQ=; b=tg7dAOXk4CYwqY0t8U52DZtiOl5U0NCSq3yA1LUuUEG1E8pNyB30rU35PWIk9DGFvU O4q1x6tqEv6EyeSh2neLePQgVjOD/oPoTBMAQd6TM8oZlFkvWYqu+b+rhu7Jv3mGCS95 MVuGunVtzjU+ci4mQe6zVySG6jfz0alNjuSNdCdNt5lLr+N08TYdC9zUhxMbccB2tjlE snW5RoUMvd5/ZpeW4DQ2ANsLcQy6NhXrmxTwh7fGZZrCyiWssFaBv+t4zCX3JFvnRtgD VIUoOCdUTqfDtsnD6es+pTFw8UptiXnP5OojO6DcDw/xN2WQhr0NvCwGdMam5in5xj1M OLkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mTKp7Q6ON2dW5g8WxlLxPPWuU/dM5NtfKl7JdpUhkyQ=; b=JpdU+hKnVC6XF81jW+sah6cAoaiLA1V2z06E88MB7O2fZCOJU68OcHpNNsDFcedttg pgizynz4T9WozD1n+tyAenP1Nv0emvQsDppXkDM43IzFnqR/kmKYoG+59d6HcUDXst3X hLOdV+HF1lb+F7HE1cfHlAZC3zRhiW+51PCTqOHOLpxUfynwlXIOn/374x5eoetifBRN SmSeiA2khNFUl9jyPihNLDyYT6MWCdPPcwwh4Ei2at0wc1/a/I+4R+I4yg4d4IPeRB3w oPf3oznKv/XE+qBLp9miEHBGP7zPG8L8teoSO0sRoBsLo3++r7A16EntWqMSDuIhphYi U33Q== X-Gm-Message-State: AOAM533IZqZ6q2t+U9ZfVt3h2jTAbroOny+aVRvtRj/5mjps/0GC20qt 1MUn6Xq3zsQARw2VfE1vjpesQw== X-Received: by 2002:a50:e8c4:: with SMTP id l4mr3903622edn.337.1609940226992; Wed, 06 Jan 2021 05:37:06 -0800 (PST) Received: from localhost.localdomain (82-65-169-74.subs.proxad.net. [82.65.169.74]) by smtp.googlemail.com with ESMTPSA id n20sm1259275ejo.83.2021.01.06.05.37.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Jan 2021 05:37:06 -0800 (PST) From: Jerome Brunet To: Felipe Balbi , Greg Kroah-Hartman Cc: Jack Pham , Ruslan Bilovol , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Ferry Toth , Peter Chen , Jerome Brunet Subject: [PATCH v2 1/5] usb: gadget: u_audio: Free requests only after callback Date: Wed, 6 Jan 2021 14:36:48 +0100 Message-Id: <20210106133652.512178-2-jbrunet@baylibre.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210106133652.512178-1-jbrunet@baylibre.com> References: <20210106133652.512178-1-jbrunet@baylibre.com> MIME-Version: 1.0 X-Patchwork-Bot: notify Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jack Pham 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 Signed-off-by: Jack Pham Signed-off-by: Jerome Brunet --- drivers/usb/gadget/function/u_audio.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c index e6d32c536781..71dd9f16c246 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,9 @@ 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); + /* else will be freed in u_audio_iso_complete() */ prm->ureq[i].req = NULL; } } -- 2.29.2