Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp1452457ybz; Wed, 22 Apr 2020 22:06:12 -0700 (PDT) X-Google-Smtp-Source: APiQypIbaBY8t3Pn7bjBawXRLUu5lLEmN3PQtag4y/yp32RfnE8TmZNBDAFovTTdNazpXG1Edata X-Received: by 2002:a50:c28a:: with SMTP id o10mr1359369edf.85.1587618372217; Wed, 22 Apr 2020 22:06:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587618372; cv=none; d=google.com; s=arc-20160816; b=eh/EWO5R+cB8tTeTeKQkpGZbzc4A5EplQLoPkfWXb6g91jtjlN15TMGv3wJ6+q6dKg ++JfXSt+0wYhsVOtc8BX1/srd2vMYPuff2wlq+W5f+UWnK6q4AW0kbCBMHlIE3w5bcta kzp/wC0x730HlI3F4/5gqGvABLPAZ+otB2kOctPHFa8YUId4rCqVhi6uGb/liBvTU1Vl e0O7MRtjIrn49U9Ltu08pXFAHW+ButoD4EYUr7SOv68pwIUSUWNLYUjI+uS/CFeMTPqX 7BlIe0JTqN6NKSgsWFQI8enzxuhrPQIs0TSFuxjDb6KIJHWyWE7n8VWNJUh+3rhLFUti aEwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=FzFFOupEbTJiKCO0+vjZwkaOJbfDiGf31CZ3WKTh5eI=; b=TnL4nNoGpqIsPnGqAV45A1ftW+bVMw5qAIDtRqQaqrrEH5VcLZ7h5qv4d4eLTLmxpN +X4A6G/DG3YJEUn1tNeIRjVC9tv0IeyMDxA+hqHykFmNYbaKtLsOuuI/pI2W6DAyPtKy aWEwYgUhRsOyJJ2EWflX0BJsxA0+GuHl58ci/QKnfciiQ8Fo75eCnbmMP4cHASnDccHN 2rK+huT8XgCrbuMHeW3C/4qj9Z0zTVHZ/7DzoGQlNPo3UDzI+jVNVGjGSgsL8lr5VowO VjzEJC/yAhcFtBz6ahCPJ7dQjyFnCXTk7uxCofpgLckBOyH+8nH4SIa0GQp37DxUKb1d cC1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@fudan.edu.cn header.s=dkim header.b=3gfq+gpd; 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=REJECT sp=REJECT dis=NONE) header.from=fudan.edu.cn Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x25si633107ejs.434.2020.04.22.22.05.46; Wed, 22 Apr 2020 22:06:12 -0700 (PDT) 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=@fudan.edu.cn header.s=dkim header.b=3gfq+gpd; 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=REJECT sp=REJECT dis=NONE) header.from=fudan.edu.cn Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726188AbgDWFCZ (ORCPT + 99 others); Thu, 23 Apr 2020 01:02:25 -0400 Received: from mail.fudan.edu.cn ([202.120.224.73]:35267 "EHLO fudan.edu.cn" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725854AbgDWFCZ (ORCPT ); Thu, 23 Apr 2020 01:02:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fudan.edu.cn; s=dkim; h=Received:From:To:Cc:Subject:Date: Message-Id; bh=FzFFOupEbTJiKCO0+vjZwkaOJbfDiGf31CZ3WKTh5eI=; b=3 gfq+gpdSWJL6dCPSa7mWohhjKPqPIrzUPVPR8PZi4VQQwYuAThZKEq3p4J+n0VIP FeweYYqwE8HcipEcUV7W5wRyUqxDK1H7qiiM79ripExcNVO+DZPfAlomMXtX8bFy 4WmA3fOdKlXZ71ZQFVIuvdbWasW6XYgOwVyEFMO2AA= Received: from localhost.localdomain (unknown [120.229.255.80]) by app2 (Coremail) with SMTP id XQUFCgDXiOErIaFe4opPAA--.26330S3; Thu, 23 Apr 2020 13:01:34 +0800 (CST) From: Xiyu Yang To: Jaroslav Kysela , Takashi Iwai , Xin Tan , "Geoffrey D. Bennett" , Greg Kroah-Hartman , Colin Ian King , Thomas Gleixner , Pierre-Louis Bossart , Xiyu Yang , alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org Cc: yuanxzhang@fudan.edu.cn, kjlu@umn.edu Subject: [PATCH] ALSA: usb-audio: Fix usb audio refcnt leak when getting spdif Date: Thu, 23 Apr 2020 12:54:19 +0800 Message-Id: <1587617711-13200-1-git-send-email-xiyuyang19@fudan.edu.cn> X-Mailer: git-send-email 2.7.4 X-CM-TRANSID: XQUFCgDXiOErIaFe4opPAA--.26330S3 X-Coremail-Antispam: 1UD129KBjvJXoW7CryrGFy3WFWkCr1rZr1DWrg_yoW8Ar13pr W3WrWvyF1YqFW3X3Z8tr4kuF95Za1Iya93GFWfKwn7Zw47Jas3Xw48t34Yvr4jk397G34a va1jvF18ua98C37anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9Y14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26w1j6s0DM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26rxl 6s0DM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s 0DM2vYz4IE04k24VAvwVAKI4IrM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI 64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8Jw Am72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAG YxC7M4IIrI8v6xkF7I0E8cxan2IY04v7MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4 AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE 17CEb7AF67AKxVWUtVW8ZwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r1j6r1xMI IF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v20xvaj40_WFyUJVCq 3wCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCT nIWIevJa73UjIFyTuYvjfUOlksUUUUU X-CM-SenderInfo: irzsiiysuqikmy6i3vldqovvfxof0/ Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org snd_microii_spdif_default_get() invokes snd_usb_lock_shutdown(), which increases the refcount of the snd_usb_audio object "chip". When snd_microii_spdif_default_get() returns, local variable "chip" becomes invalid, so the refcount should be decreased to keep refcount balanced. The reference counting issue happens in several exception handling paths of snd_microii_spdif_default_get(). When those error scenarios occur such as usb_ifnum_to_if() returns NULL, the function forgets to decrease the refcnt increased by snd_usb_lock_shutdown(), causing a refcnt leak. Fix this issue by jumping to "end" label when those error scenarios occur. Signed-off-by: Xiyu Yang Signed-off-by: Xin Tan --- sound/usb/mixer_quirks.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c index c237e24f08d9..0f072426b84c 100644 --- a/sound/usb/mixer_quirks.c +++ b/sound/usb/mixer_quirks.c @@ -1508,11 +1508,15 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol, /* use known values for that card: interface#1 altsetting#1 */ iface = usb_ifnum_to_if(chip->dev, 1); - if (!iface || iface->num_altsetting < 2) - return -EINVAL; + if (!iface || iface->num_altsetting < 2) { + err = -EINVAL; + goto end; + } alts = &iface->altsetting[1]; - if (get_iface_desc(alts)->bNumEndpoints < 1) - return -EINVAL; + if (get_iface_desc(alts)->bNumEndpoints < 1) { + err = -EINVAL; + goto end; + } ep = get_endpoint(alts, 0)->bEndpointAddress; err = snd_usb_ctl_msg(chip->dev, -- 2.7.4