Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp783786ybt; Fri, 19 Jun 2020 13:42:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzlI3LVxm+XlKeXHR25gdg+if3dyv87GzKnNj8WdO8gRZR3ruiShEaXPs68grh7xdAv3yxx X-Received: by 2002:a50:9eaf:: with SMTP id a44mr5199215edf.121.1592599347725; Fri, 19 Jun 2020 13:42:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592599347; cv=none; d=google.com; s=arc-20160816; b=rTtoLQphpYoWKzzzw49KJbYipP/6cgSRqRWhM/jlnQu/Nf5ZNNTwx+HN0qHBLtT9/T HNGtz50sThCinNwOc7YQ1StFghRSkGr4XbJ1HW2OqqhWfMLVaj64P0srSDLxdTLgAy7B 6gXcQlDV9rMdGRkFk1ChOz97trvRORToVukkBXJjeVcYfPh+rQ+e6gytSqW6jkMRx2ce VdPJ8xd5Gn56bxykV/y4WlWLD6Bap1DAArnZxE5pz6QXh1KcrtLZj+jl5iEQaUi/7KOd ouhonj0XXzdT8wj4YFKtXllLpD1w9Lk6ut7zToTsBKpAkqn4jhBQcOMZzu2gQTDXCMgE z+5g== 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=LXxsQ9Hdyfb24UwX1ZDQXovWt/afNMmH+UHkEj043/U=; b=aqzEvDJoNlrHxxqf514EcDXukPQpqPBHUvxZWWl4P3u41CoUrJ0NAvT/kejQofOCiV lzGUYHpj27PvMjd0NjrGBkCnYGDcC+h2RbAWRP5wA4VnqMQgKSdTMRsrztbJKvgIkMyc 3WcV8Aae1O0+ENFDjfPN3Q1miR4APCsxSnYTzKO0zIGu0sXrzg3ObLUXXrO5rqZzgxvB Znt7/2XwFeUJzBjyHYgLNgBYGqGPZr65RcfOBRvxxos8E4kBpk1/Vo2D92xV+n5/mqTP GalZD4PthaDwIdugK5Uyo0J0t+3sx6vFAgvJSwl8ax0TPOFOoge495ctlTNDqUfnynVN Fb7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=V54FZ9vS; 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 b17si4778696eja.150.2020.06.19.13.42.05; Fri, 19 Jun 2020 13:42:27 -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=V54FZ9vS; 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 S2390641AbgFSPAb (ORCPT + 99 others); Fri, 19 Jun 2020 11:00:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:56338 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390608AbgFSPAB (ORCPT ); Fri, 19 Jun 2020 11:00:01 -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 3349B218AC; Fri, 19 Jun 2020 15:00:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592578800; bh=d8+EqofeeBMOBFNJT6NfDdQN0skLq6rIHmBekhQBzSo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V54FZ9vSiDT3xsANoU/EjYKxLXFdUfUGhmqviSYhDLZ1uESEaTJx7sNmJIKFDYzbh jLuSQtgiyHpOvHmQV9tttbUPnHQNGm5Yj8eGkuE0fFrHl6Q2n/Yny1PmdLukWLV/sT 45faoNF7TVGBtVZ3TkA0KVMEAPm48kSJkIODAVE0= 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 4.19 162/267] mwifiex: Fix memory corruption in dump_station Date: Fri, 19 Jun 2020 16:32:27 +0200 Message-Id: <20200619141656.581746549@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619141648.840376470@linuxfoundation.org> References: <20200619141648.840376470@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 7b74ef71bef1..650191db25cb 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -1468,7 +1468,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) { @@ -1478,13 +1479,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