diff options
Diffstat (limited to 'net/wireless')
| -rw-r--r-- | net/wireless/nl80211.c | 10 | ||||
| -rw-r--r-- | net/wireless/scan.c | 14 | ||||
| -rw-r--r-- | net/wireless/sme.c | 2 | 
3 files changed, 16 insertions, 10 deletions
| diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 034af85f79d8..b1df42e4f1eb 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -5,7 +5,7 @@   * Copyright 2006-2010	Johannes Berg <[email protected]>   * Copyright 2013-2014  Intel Mobile Communications GmbH   * Copyright 2015-2017	Intel Deutschland GmbH - * Copyright (C) 2018-2020 Intel Corporation + * Copyright (C) 2018-2021 Intel Corporation   */  #include <linux/if.h> @@ -229,9 +229,13 @@ static int validate_beacon_head(const struct nlattr *attr,  	unsigned int len = nla_len(attr);  	const struct element *elem;  	const struct ieee80211_mgmt *mgmt = (void *)data; -	bool s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control);  	unsigned int fixedlen, hdrlen; +	bool s1g_bcn; +	if (len < offsetofend(typeof(*mgmt), frame_control)) +		goto err; + +	s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control);  	if (s1g_bcn) {  		fixedlen = offsetof(struct ieee80211_ext,  				    u.s1g_beacon.variable); @@ -5485,7 +5489,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)  			rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],  			¶ms);  		if (err) -			return err; +			goto out;  	}  	nl80211_calculate_ap_params(¶ms); diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 019952d4fc7d..758eb7d2a706 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -2352,14 +2352,16 @@ cfg80211_inform_single_bss_frame_data(struct wiphy *wiphy,  		return NULL;  	if (ext) { -		struct ieee80211_s1g_bcn_compat_ie *compat; -		u8 *ie; +		const struct ieee80211_s1g_bcn_compat_ie *compat; +		const struct element *elem; -		ie = (void *)cfg80211_find_ie(WLAN_EID_S1G_BCN_COMPAT, -					      variable, ielen); -		if (!ie) +		elem = cfg80211_find_elem(WLAN_EID_S1G_BCN_COMPAT, +					  variable, ielen); +		if (!elem) +			return NULL; +		if (elem->datalen < sizeof(*compat))  			return NULL; -		compat = (void *)(ie + 2); +		compat = (void *)elem->data;  		bssid = ext->u.s1g_beacon.sa;  		capability = le16_to_cpu(compat->compat_info);  		beacon_int = le16_to_cpu(compat->beacon_int); diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 07756ca5e3b5..08a70b4f090c 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c @@ -529,7 +529,7 @@ static int cfg80211_sme_connect(struct wireless_dev *wdev,  		cfg80211_sme_free(wdev);  	} -	if (WARN_ON(wdev->conn)) +	if (wdev->conn)  		return -EINPROGRESS;  	wdev->conn = kzalloc(sizeof(*wdev->conn), GFP_KERNEL); |