Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2738495pxv; Mon, 12 Jul 2021 00:20:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyPjomEKTP4hZroEU6nAsC20CsVPMsW5Z/5oAr1tSTM/aaogBfgn+LDseF5iWQRjxycwpXT X-Received: by 2002:a02:956a:: with SMTP id y97mr42483755jah.58.1626074415354; Mon, 12 Jul 2021 00:20:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626074415; cv=none; d=google.com; s=arc-20160816; b=CSa8SEpj7Ffn6I7g9+7z0DuQcQrLMFBOfcuCqtW64OFaJpElenZD5oCpul2HQCgINT NMeqt9TWZsr53dVpJUukcG+tk8VS4lwVd7cjgroRBgpUD/oWMcpZuJ46yAkfQg+fJKdJ RZnUghMzgIWPLE7hEBRIAhCpXRoJwBNE9dwvJjt2lz+99eKBlWTGMAgHmCSYDAQAjlVQ XnmTtHtJa0jjkAjomL9aly8O3oQng1KljYQcLHAj1wX0qTzfNU0Z1MJEPYR5q8XeRVdq xqb9YwHqJEOagKTFFhKXXw9eaKNqXJJ+y8fiVsHDQ50/cB15uHc8QXkClUwG3DZHaTFn eeJA== 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=HIanECEzUAXf2pMDAEB2RdBBkBCsX/+SjrxQ/7N5nGw=; b=DrL7X8NO6vaLV/C12+8dXkipoVLuptZFGURZgJeqINChe387ZMxrMQ/lMuUBaI9m79 mPWGxdvOM4CusSyYZ8dV2myAlA7qEq00ODyDrKgDZQ/ndzhVS3uuPuG9vHqcPGj/GtT8 ctfQCN5W+1+iHb7hXIDcKXPRwswpSITfts8ziDruHr+9e+RJVWFFjJtiqn819bewIjEl hhfWE0/dOr6pdouPpXqHN18MhI8G4gmheeBKctOnT3kqBSZ7spH2WbEIEi1IkEQZBiA0 rqv6QNMKXhtbMIFGJbcDP/65szA4QH1AFEqu9s7pmWo+kzXz4whx/Md470wF06tNzAgX IjbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=08eKXfoM; 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 h41si15276989jaa.50.2021.07.12.00.20.03; Mon, 12 Jul 2021 00:20:15 -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=@linuxfoundation.org header.s=korg header.b=08eKXfoM; 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 S1343799AbhGLHUG (ORCPT + 99 others); Mon, 12 Jul 2021 03:20:06 -0400 Received: from mail.kernel.org ([198.145.29.99]:54228 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234094AbhGLGxx (ORCPT ); Mon, 12 Jul 2021 02:53:53 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 65CDD608FE; Mon, 12 Jul 2021 06:50:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626072649; bh=QIcrSoPAStZLEydIq7pJN/J5TiFrrMuUZPmEuxKOUuQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=08eKXfoM4I9gPDk5ncMgIZ1yEhmA+SxqknUF4Sd8QpeIDbpiEpVX35TDMuT1Qh1cj chlQ2MedtSoZhkXZ6bvTyKzQ3GlPYBQ85SI/3T63krajM4/m4vDOxgApg9u0Y5GiIY BQm1KpD7zOEZVBRnShkKK0hiMd8i9T/kfP4/7aHw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Pavel Skripkin , Sasha Levin Subject: [PATCH 5.10 525/593] staging: rtl8712: fix memory leak in rtl871x_load_fw_cb Date: Mon, 12 Jul 2021 08:11:25 +0200 Message-Id: <20210712060950.816933289@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060843.180606720@linuxfoundation.org> References: <20210712060843.180606720@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: Pavel Skripkin [ Upstream commit e02a3b945816a77702a2769a70ef5f9b06e49d54 ] There is a leak in rtl8712 driver. The problem was in non-freed adapter data if firmware load failed. This leak can be reproduced with this code: https://syzkaller.appspot.com/text?tag=ReproC&x=16612f02d00000, Autoload must fail (to not hit memory leak reported by syzkaller) There are 2 possible ways how rtl871x_load_fw_cb() and r871xu_dev_remove() can be called (in case of fw load error). 1st case: r871xu_dev_remove() then rtl871x_load_fw_cb() In this case r871xu_dev_remove() will wait for completion and then will jump to the end, because rtl871x_load_fw_cb() set intfdata to NULL: if (pnetdev) { struct _adapter *padapter = netdev_priv(pnetdev); /* never exit with a firmware callback pending */ wait_for_completion(&padapter->rtl8712_fw_ready); pnetdev = usb_get_intfdata(pusb_intf); usb_set_intfdata(pusb_intf, NULL); if (!pnetdev) goto firmware_load_fail; ... clean up code here ... } 2nd case: rtl871x_load_fw_cb() then r871xu_dev_remove() In this case pnetdev (from code snippet above) will be zero (because rtl871x_load_fw_cb() set it to NULL) And clean up code won't be executed again. So, in all cases we need to free adapted data in rtl871x_load_fw_cb(), because disconnect function cannot take care of it. And there won't be any race conditions, because complete() call happens after setting intfdata to NULL. In previous patch I moved out free_netdev() from r8712_free_drv_sw() and that's why now it's possible to free adapter data and then call complete. Fixes: 8c213fa59199 ("staging: r8712u: Use asynchronous firmware loading") Signed-off-by: Pavel Skripkin Link: https://lore.kernel.org/r/81e68fe0194499cc2e7692d35bc4dcf167827d8f.1623620630.git.paskripkin@gmail.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/staging/rtl8712/hal_init.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/staging/rtl8712/hal_init.c b/drivers/staging/rtl8712/hal_init.c index 715f1fe8b472..22974277afa0 100644 --- a/drivers/staging/rtl8712/hal_init.c +++ b/drivers/staging/rtl8712/hal_init.c @@ -40,7 +40,10 @@ static void rtl871x_load_fw_cb(const struct firmware *firmware, void *context) dev_err(&udev->dev, "r8712u: Firmware request failed\n"); usb_put_dev(udev); usb_set_intfdata(usb_intf, NULL); + r8712_free_drv_sw(adapter); + adapter->dvobj_deinit(adapter); complete(&adapter->rtl8712_fw_ready); + free_netdev(adapter->pnetdev); return; } adapter->fw = firmware; -- 2.30.2