Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp591101ybt; Fri, 19 Jun 2020 08:52:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxP7hFRFGXYlMbLr2C5qD/4QftFXaBCAtrUlp0psx9xq5mwMom6p9vZz+Um3EcdbhrM5jLj X-Received: by 2002:a17:906:5243:: with SMTP id y3mr4477428ejm.193.1592581959570; Fri, 19 Jun 2020 08:52:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592581959; cv=none; d=google.com; s=arc-20160816; b=s6X7pij5JkrWbX5kmb16iO/yToDdGc1qx0fnCSrWKFO1yUGhFSH5iliW2Md+d964w6 Sb/MvyGO/Re4OBNneaDTmnE58sCpOGdCszrHN5Jtv8guNNKwmQdOW222FQAAIVvhy/zJ spG7Apj7GrhwDcTlU2PPN9k70sFqCZhbGus3dLScXjmGgIQqfJlkfDmNhnH+uKzDZ4tQ Dj1T1pqZG2NyHWIdLnod/tOMq6CAk+TzE7B8Gqpg7aeZBT4wDV5PznAIs76DNTn+M6Eb L0/RiM7iKm8x8O8GSFTbqcKogwKsRW6lXTCMVahzZFCIMaN8Odl9cHQtdubm2bPLcStv I7cA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ntuMfNyBnSRTPE+XBEa4Cu4TvSD+sdUk8UKpZHy4tWg=; b=BHXNp5BEYWcIq9UL1bfDa9ZGIMXvR7L0UykH7ROo5M5zmIVOKNfFOiSor9MZqqtTqJ OyGbSXNUZWfHSYqsOF6tLYVKUZk8Hat+HstjXgy13r1LHJmf2Vz0XFxE5HYtYERT05hu w+Wb+z4uDyEN6CfpwY+OObwFXbGnBJ/dI2vR6Y7gSrIc0nzp7FVdSjLGuTLGVZrWOOWk meuy/wUk/mL32PMjXyBoh2RkEkvAkU2XPaiYQtlqRh4fV7n4PYcllrOkWSx44Z0UJ6OB RlQkjAs+hTI9GVcZryAspJHgy3rCH8bCo0WfncrsIGRQF9/hfcwnW0fxmjSuCKoS7bv3 dsAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="yYlxZx/C"; 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 u4si4593027edd.83.2020.06.19.08.52.17; Fri, 19 Jun 2020 08:52:39 -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=@kernel.org header.s=default header.b="yYlxZx/C"; 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 S2394014AbgFSPtn (ORCPT + 99 others); Fri, 19 Jun 2020 11:49:43 -0400 Received: from mail.kernel.org ([198.145.29.99]:56778 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404147AbgFSPZC (ORCPT ); Fri, 19 Jun 2020 11:25:02 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 66EDC20B80; Fri, 19 Jun 2020 15:25:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592580300; bh=IAEmTo8r0QTBrTT1aCXKT7SMUHR0JX6FwVOf55EPqtY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yYlxZx/Ck1sljtuBRfgkwyw/0/VUIIuc5RGDXWwWDnzGHH2kw19tNl57tw8MtmUk0 t5Q/j5JSV8S+UessU3S45iAjAalFWl2erRNzBuohsXC1uKlu0H23XZH9qSZL/P5pQB QDBGYhGQohgkIVQdRMykkqflUFGRDzWFk96FjGpo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Pali=20Roh=C3=A1r?= , Ganapathi Bhat , Kalle Valo , Sasha Levin Subject: [PATCH 5.7 197/376] mwifiex: Fix memory corruption in dump_station Date: Fri, 19 Jun 2020 16:31:55 +0200 Message-Id: <20200619141719.669207725@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619141710.350494719@linuxfoundation.org> References: <20200619141710.350494719@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pali Rohár [ Upstream commit 3aa42bae9c4d1641aeb36f1a8585cd1d506cf471 ] The mwifiex_cfg80211_dump_station() uses static variable for iterating over a linked list of all associated stations (when the driver is in UAP role). This has a race condition if .dump_station is called in parallel for multiple interfaces. This corruption can be triggered by registering multiple SSIDs and calling, in parallel for multiple interfaces iw dev station dump [16750.719775] Unable to handle kernel paging request at virtual address dead000000000110 ... [16750.899173] Call trace: [16750.901696] mwifiex_cfg80211_dump_station+0x94/0x100 [mwifiex] [16750.907824] nl80211_dump_station+0xbc/0x278 [cfg80211] [16750.913160] netlink_dump+0xe8/0x320 [16750.916827] netlink_recvmsg+0x1b4/0x338 [16750.920861] ____sys_recvmsg+0x7c/0x2b0 [16750.924801] ___sys_recvmsg+0x70/0x98 [16750.928564] __sys_recvmsg+0x58/0xa0 [16750.932238] __arm64_sys_recvmsg+0x28/0x30 [16750.936453] el0_svc_common.constprop.3+0x90/0x158 [16750.941378] do_el0_svc+0x74/0x90 [16750.944784] el0_sync_handler+0x12c/0x1a8 [16750.948903] el0_sync+0x114/0x140 [16750.952312] Code: f9400003 f907f423 eb02007f 54fffd60 (b9401060) [16750.958583] ---[ end trace c8ad181c2f4b8576 ]--- This patch drops the use of the static iterator, and instead every time the function is called iterates to the idx-th position of the linked-list. It would be better to convert the code not to use linked list for associated stations storage (since the chip has a limited number of associated stations anyway - it could just be an array). Such a change may be proposed in the future. In the meantime this patch can backported into stable kernels in this simple form. Fixes: 8baca1a34d4c ("mwifiex: dump station support in uap mode") Signed-off-by: Pali Rohár Acked-by: Ganapathi Bhat Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20200515075924.13841-1-pali@kernel.org Signed-off-by: Sasha Levin --- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index 1566d2197906..12bfd653a405 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -1496,7 +1496,8 @@ mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev, int idx, u8 *mac, struct station_info *sinfo) { struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); - static struct mwifiex_sta_node *node; + struct mwifiex_sta_node *node; + int i; if ((GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) && priv->media_connected && idx == 0) { @@ -1506,13 +1507,10 @@ mwifiex_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev, mwifiex_send_cmd(priv, HOST_CMD_APCMD_STA_LIST, HostCmd_ACT_GEN_GET, 0, NULL, true); - if (node && (&node->list == &priv->sta_list)) { - node = NULL; - return -ENOENT; - } - - node = list_prepare_entry(node, &priv->sta_list, list); - list_for_each_entry_continue(node, &priv->sta_list, list) { + i = 0; + list_for_each_entry(node, &priv->sta_list, list) { + if (i++ != idx) + continue; ether_addr_copy(mac, node->mac_addr); return mwifiex_dump_station_info(priv, node, sinfo); } -- 2.25.1