Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp3764751pxv; Mon, 28 Jun 2021 12:14:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxtngtlbWdM7mq1Q0zg1jq/Q0DgXHjFcGZmH2fWMQTpBVBb2tOjKi1/jNRzXYthfMyjIo7M X-Received: by 2002:aa7:c997:: with SMTP id c23mr34979401edt.42.1624907671873; Mon, 28 Jun 2021 12:14:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624907671; cv=none; d=google.com; s=arc-20160816; b=g5/+B386o0nrXdeQJYmz+Y6BURDFngTDqayIWG6S94eDR49lnQrvl+2t5jKTxbv4EE +RB6wy3sygrDyLEpD5bQlzq5XepP2KFMnK42G6YXOttOhp490O4piY7Pn4LrHLTuXKSJ n1QsaqLgWMBZDJ07H0rPnd6EH0Cn6iTsAa3q2Odz1ngMzJVe9pwb4Jg+HMeHVOLKBq9z y1Kd1Ehd1vUR3xyjTQbNNw+B/6Ly+3hsgige5dX4OJr3n4qEZAk+ghyPtSaFsWo2yfpS guDRJwDIRIaUOpXOYQE6/gQW2+p4lJoravuGSCZuonu6NSK16dYVabVaBuSeL9vQ4hQz 8RRQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=FwNnXR+FUeyKHwAmeVtUTUDs+/QPyUwT3ajQg0giqOI=; b=Vnp99eY/KMVMY/t/VDqtHbOiln7SZgT52WBd3t5g5IS69WyShReys1OuJyzvfXguYv ey2fgVzORdqA7LqoQqnIp0JM9mmbQzh2KxmLK5nLaXaa2SU8DzAL4KNJcgCjK+F/emJo UApzbsgwNUUgz+JBnuOv3eYK6fwlJK2BkgfcQS9L2JuY5BPOix2KOjzhKscqjjB/4BxX HXLCG6FVQDkvlnR6kps7wCp5LPmUroYFpuevg5E++jIEAchaZvJlmgK64lrSRU5pnjO6 llPu3qa0Ipkbpu4bBroP0OWGefd+fRylob7eO9n7+JdZk3AAjI7cjhJdHqiwmb+rUS/P R2AA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=f2SdIN5O; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s24si14778045ejs.124.2021.06.28.12.14.07; Mon, 28 Jun 2021 12:14:31 -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=k20201202 header.b=f2SdIN5O; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234350AbhF1Ofs (ORCPT + 99 others); Mon, 28 Jun 2021 10:35:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:37368 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234807AbhF1Oaa (ORCPT ); Mon, 28 Jun 2021 10:30:30 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8665661CC1; Mon, 28 Jun 2021 14:26:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1624890413; bh=R+P/fmAqPBWiOGyyElPymleMNovTkWNa6HaTdgpPwzw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f2SdIN5O0UW51b3O/DtJ3+f8wgHSnmzp1Zubhbt96c5RXSy8wZOdUanZOzy6q1nOH 7fRDoYxEGMLEEABAn8IvfhnwAINklIDup6SVjiSAHiwz9bHZ3h8VIzsPVX+9UEg2Mp +iQzD1C1B3S2GjNqwwHY9KWbY7iELsH2TX59bVAeji46tO6u2JQ3lCKfQeO/t1owWu bZyNVl+877yBC9AJsSHRAoc4bBxw8ETWKwhA+ZtsDVscQFqB8JhkmRLhp4XcIYgF9X yjADzhp7vRrORoe4PuZc8OszmdTIL44/AsBMfQz9pQfZfk41IiiCmidJqrjy4b9OYJ msYuAxu9mWivA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Johannes Berg , Luca Coelho , Sasha Levin Subject: [PATCH 5.10 052/101] mac80211: handle various extensible elements correctly Date: Mon, 28 Jun 2021 10:25:18 -0400 Message-Id: <20210628142607.32218-53-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210628142607.32218-1-sashal@kernel.org> References: <20210628142607.32218-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.10.47-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.10.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.10.47-rc1 X-KernelTest-Deadline: 2021-06-30T14:25+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Johannes Berg [ Upstream commit 652e8363bbc7d149fa194a5cbf30b1001c0274b0 ] Various elements are parsed with a requirement to have an exact size, when really we should only check that they have the minimum size that we need. Check only that and therefore ignore any additional data that they might carry. Signed-off-by: Johannes Berg Signed-off-by: Luca Coelho Link: https://lore.kernel.org/r/iwlwifi.20210618133832.cd101f8040a4.Iadf0e9b37b100c6c6e79c7b298cc657c2be9151a@changeid Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- net/mac80211/util.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/net/mac80211/util.c b/net/mac80211/util.c index d8f9fb0646a4..fbf56a203c0e 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -954,7 +954,7 @@ static void ieee80211_parse_extension_element(u32 *crc, switch (elem->data[0]) { case WLAN_EID_EXT_HE_MU_EDCA: - if (len == sizeof(*elems->mu_edca_param_set)) { + if (len >= sizeof(*elems->mu_edca_param_set)) { elems->mu_edca_param_set = data; if (crc) *crc = crc32_be(*crc, (void *)elem, @@ -975,7 +975,7 @@ static void ieee80211_parse_extension_element(u32 *crc, } break; case WLAN_EID_EXT_UORA: - if (len == 1) + if (len >= 1) elems->uora_element = data; break; case WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME: @@ -983,7 +983,7 @@ static void ieee80211_parse_extension_element(u32 *crc, elems->max_channel_switch_time = data; break; case WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION: - if (len == sizeof(*elems->mbssid_config_ie)) + if (len >= sizeof(*elems->mbssid_config_ie)) elems->mbssid_config_ie = data; break; case WLAN_EID_EXT_HE_SPR: @@ -992,7 +992,7 @@ static void ieee80211_parse_extension_element(u32 *crc, elems->he_spr = data; break; case WLAN_EID_EXT_HE_6GHZ_CAPA: - if (len == sizeof(*elems->he_6ghz_capa)) + if (len >= sizeof(*elems->he_6ghz_capa)) elems->he_6ghz_capa = data; break; } @@ -1081,14 +1081,14 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, switch (id) { case WLAN_EID_LINK_ID: - if (elen + 2 != sizeof(struct ieee80211_tdls_lnkie)) { + if (elen + 2 < sizeof(struct ieee80211_tdls_lnkie)) { elem_parse_failed = true; break; } elems->lnk_id = (void *)(pos - 2); break; case WLAN_EID_CHAN_SWITCH_TIMING: - if (elen != sizeof(struct ieee80211_ch_switch_timing)) { + if (elen < sizeof(struct ieee80211_ch_switch_timing)) { elem_parse_failed = true; break; } @@ -1251,7 +1251,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, elems->sec_chan_offs = (void *)pos; break; case WLAN_EID_CHAN_SWITCH_PARAM: - if (elen != + if (elen < sizeof(*elems->mesh_chansw_params_ie)) { elem_parse_failed = true; break; @@ -1260,7 +1260,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, break; case WLAN_EID_WIDE_BW_CHANNEL_SWITCH: if (!action || - elen != sizeof(*elems->wide_bw_chansw_ie)) { + elen < sizeof(*elems->wide_bw_chansw_ie)) { elem_parse_failed = true; break; } @@ -1279,7 +1279,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, ie = cfg80211_find_ie(WLAN_EID_WIDE_BW_CHANNEL_SWITCH, pos, elen); if (ie) { - if (ie[1] == sizeof(*elems->wide_bw_chansw_ie)) + if (ie[1] >= sizeof(*elems->wide_bw_chansw_ie)) elems->wide_bw_chansw_ie = (void *)(ie + 2); else @@ -1323,7 +1323,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, elems->cisco_dtpc_elem = pos; break; case WLAN_EID_ADDBA_EXT: - if (elen != sizeof(struct ieee80211_addba_ext_ie)) { + if (elen < sizeof(struct ieee80211_addba_ext_ie)) { elem_parse_failed = true; break; } @@ -1349,7 +1349,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, elem, elems); break; case WLAN_EID_S1G_CAPABILITIES: - if (elen == sizeof(*elems->s1g_capab)) + if (elen >= sizeof(*elems->s1g_capab)) elems->s1g_capab = (void *)pos; else elem_parse_failed = true; -- 2.30.2