Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp757110ybt; Fri, 19 Jun 2020 12:59:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx6XmgSbnxH+aApWBr8V4DppCXutcE+hsxRJSyORDadio6IpPYTKc4ra1v5PDMgTgOczqE4 X-Received: by 2002:a17:906:c837:: with SMTP id dd23mr5392467ejb.272.1592596748331; Fri, 19 Jun 2020 12:59:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592596748; cv=none; d=google.com; s=arc-20160816; b=jrpOg26OywPYZGyfheCIp/ux2ZgeVf/pv0o7YJ5QFqP9U+mzPAeKcTDAg2OF55F2tL sjTQ6e+BKwm638zrtri6c+r9NNHdLrwvf+8ZXLBg2kd2+rsLByJTATiCPf28KYr0SAWF qwtD+z0HKySrM5pfyMeFPx7OB2Y9ASsm46z6KW2KEaEa8wv5dEQdSC0aAfcxQnMSV+tw lvg41rlHCaYajaelZXiycOMcMnTv8mfO/hwoVVRGhFV++cHbQziMzuOppZRTvp0oZSrp Vy1lLFOZl+Gypp3HK9KGr/ryWdcv+OWBBKvH+9N432/XmhQYqDJffmWNI0dUNtUFN1jI DEiA== 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=svfRlWgI/HGKkkbPsV+rvBJhc3uQjU4WVerj3TXv6ps=; b=c5oQYkwUHvGf92lwY0E99/NTOBRk2sjfTaXzdrpZU+NPxVs6t2pFaVPRW03MLgMO9M 1bBf9nRcgqdZk5T9fzCqVW/96gm+On7FC+5hTzmwM1ponaAWi0HOzyAQQZXGbLQX1ljS GD/u3TRhm0sycpDp+wVi5ZFfklblfGAMSxCL9R97e+vTn0f2WYr2wgFCa0KDqTuM4p7H 07Zo0eS6aI2C/Pp4JKSh9+T6qIqm5k41hZnI9rEjiMVSGuZ/cmhNngYPijLX+utQ3wRm wibkJ5QSHwu2wX0Rvyv3SlgictpGZi9F15mg+tHfZf7ydE+kaRg/J4G1fS1q6R1Kvt9x diUw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mMgK7Rps; 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 oi20si4328696ejb.571.2020.06.19.12.58.45; Fri, 19 Jun 2020 12:59:08 -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=mMgK7Rps; 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 S2388113AbgFSOnY (ORCPT + 99 others); Fri, 19 Jun 2020 10:43:24 -0400 Received: from mail.kernel.org ([198.145.29.99]:33856 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388419AbgFSOm5 (ORCPT ); Fri, 19 Jun 2020 10:42:57 -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 CF6A220A8B; Fri, 19 Jun 2020 14:42:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592577776; bh=e81fpO5jDYVmeHxjJRSlDWfy34xiiryjAtaKi+4WFKE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mMgK7RpsZyIKNh9stB5Qj2/RcX4Vl/KV3oKtiNcYlL4avt0CzGR0JuTR8KurSBD+p /xVPNQIHbBJQfmmVsb7/qy3S7XGvTYovmLVkVVzAL1Xsd260LMUsWwA39ysZ6oMpHw M/8uNAmgo+pm4c6FqHVj7cBj6T73P08hX9WisHfs= 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.9 084/128] mwifiex: Fix memory corruption in dump_station Date: Fri, 19 Jun 2020 16:32:58 +0200 Message-Id: <20200619141624.599712787@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619141620.148019466@linuxfoundation.org> References: <20200619141620.148019466@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 94901b0041ce..c597af69f48f 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -1446,7 +1446,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) { @@ -1456,13 +1457,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