diff options
Diffstat (limited to 'net/wireless')
| -rw-r--r-- | net/wireless/Makefile | 1 | ||||
| -rw-r--r-- | net/wireless/ap.c | 1 | ||||
| -rw-r--r-- | net/wireless/chan.c | 1 | ||||
| -rw-r--r-- | net/wireless/core.h | 1 | ||||
| -rw-r--r-- | net/wireless/debugfs.h | 1 | ||||
| -rw-r--r-- | net/wireless/ethtool.c | 1 | ||||
| -rw-r--r-- | net/wireless/ibss.c | 1 | ||||
| -rw-r--r-- | net/wireless/mesh.c | 1 | ||||
| -rw-r--r-- | net/wireless/mlme.c | 1 | ||||
| -rw-r--r-- | net/wireless/nl80211.c | 20 | ||||
| -rw-r--r-- | net/wireless/nl80211.h | 1 | ||||
| -rw-r--r-- | net/wireless/rdev-ops.h | 1 | ||||
| -rw-r--r-- | net/wireless/scan.c | 1 | ||||
| -rw-r--r-- | net/wireless/sme.c | 51 | ||||
| -rw-r--r-- | net/wireless/sysfs.h | 1 | ||||
| -rw-r--r-- | net/wireless/trace.h | 1 | ||||
| -rw-r--r-- | net/wireless/util.c | 1 | ||||
| -rw-r--r-- | net/wireless/wext-compat.c | 1 | ||||
| -rw-r--r-- | net/wireless/wext-sme.c | 1 | 
19 files changed, 77 insertions, 11 deletions
diff --git a/net/wireless/Makefile b/net/wireless/Makefile index d06e5015751a..b7c0300e0b08 100644 --- a/net/wireless/Makefile +++ b/net/wireless/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_CFG80211) += cfg80211.o  obj-$(CONFIG_LIB80211) += lib80211.o  obj-$(CONFIG_LIB80211_CRYPT_WEP) += lib80211_crypt_wep.o diff --git a/net/wireless/ap.c b/net/wireless/ap.c index 25666d3009be..63682176c96c 100644 --- a/net/wireless/ap.c +++ b/net/wireless/ap.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/ieee80211.h>  #include <linux/export.h>  #include <net/cfg80211.h> diff --git a/net/wireless/chan.c b/net/wireless/chan.c index b8aa5a7d5c77..fad1b5baf8ff 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * This file contains helper code to handle channel   * settings and keeping track of what is possible at diff --git a/net/wireless/core.h b/net/wireless/core.h index 6e809325af3b..705835047f98 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * Wireless configuration interface internals.   * diff --git a/net/wireless/debugfs.h b/net/wireless/debugfs.h index 74fdd3811427..a8a135d94ab5 100644 --- a/net/wireless/debugfs.h +++ b/net/wireless/debugfs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __CFG80211_DEBUGFS_H  #define __CFG80211_DEBUGFS_H diff --git a/net/wireless/ethtool.c b/net/wireless/ethtool.c index e9e91298c70d..a9c0f368db5d 100644 --- a/net/wireless/ethtool.c +++ b/net/wireless/ethtool.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/utsname.h>  #include <net/cfg80211.h>  #include "core.h" diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c index 10bf040a0982..413d4f4e6334 100644 --- a/net/wireless/ibss.c +++ b/net/wireless/ibss.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Some IBSS support code for cfg80211.   * diff --git a/net/wireless/mesh.c b/net/wireless/mesh.c index 421a6b80ec62..51aa55618ef7 100644 --- a/net/wireless/mesh.c +++ b/net/wireless/mesh.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/ieee80211.h>  #include <linux/export.h>  #include <net/cfg80211.h> diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index d8df7a5180a0..e7c64a8dce54 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * cfg80211 MLME SAP interface   * diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 0df8023f480b..d396cb61a280 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -549,6 +549,14 @@ nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = {  	[NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED },  }; +/* policy for packet pattern attributes */ +static const struct nla_policy +nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = { +	[NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, }, +	[NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, }, +	[NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 }, +}; +  static int nl80211_prepare_wdev_dump(struct sk_buff *skb,  				     struct netlink_callback *cb,  				     struct cfg80211_registered_device **rdev, @@ -9987,6 +9995,9 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)  		if (err)  			return err; +		if (!setup.chandef.chan) +			return -EINVAL; +  		err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band,  					      &setup.beacon_rate);  		if (err) @@ -10529,7 +10540,8 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)  			u8 *mask_pat;  			nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, -					 NULL, info->extack); +					 nl80211_packet_pattern_policy, +					 info->extack);  			err = -EINVAL;  			if (!pat_tb[NL80211_PKTPAT_MASK] ||  			    !pat_tb[NL80211_PKTPAT_PATTERN]) @@ -10778,7 +10790,8 @@ static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,  			    rem) {  		u8 *mask_pat; -		nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, NULL, NULL); +		nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, +				 nl80211_packet_pattern_policy, NULL);  		if (!pat_tb[NL80211_PKTPAT_MASK] ||  		    !pat_tb[NL80211_PKTPAT_PATTERN])  			return -EINVAL; @@ -10903,6 +10916,9 @@ static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)  	if (err)  		return err; +	if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || +	    !tb[NL80211_REKEY_DATA_KCK]) +		return -EINVAL;  	if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN)  		return -ERANGE;  	if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN) diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h index b96933322077..fc415c8f7aac 100644 --- a/net/wireless/nl80211.h +++ b/net/wireless/nl80211.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __NET_WIRELESS_NL80211_H  #define __NET_WIRELESS_NL80211_H diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h index ce23d7d49960..0c06240d25af 100644 --- a/net/wireless/rdev-ops.h +++ b/net/wireless/rdev-ops.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __CFG80211_RDEV_OPS  #define __CFG80211_RDEV_OPS diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 9f0901f3e42b..f6c5fe482506 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * cfg80211 scan result handling   * diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 0a49b88070d0..3dd05a08c60a 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * SME code for cfg80211   * both driver SME event handling and the SME implementation @@ -522,11 +523,6 @@ static int cfg80211_sme_connect(struct wireless_dev *wdev,  		return -EOPNOTSUPP;  	if (wdev->current_bss) { -		if (!prev_bssid) -			return -EALREADY; -		if (prev_bssid && -		    !ether_addr_equal(prev_bssid, wdev->current_bss->pub.bssid)) -			return -ENOTCONN;  		cfg80211_unhold_bss(wdev->current_bss);  		cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);  		wdev->current_bss = NULL; @@ -1063,11 +1059,35 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,  	ASSERT_WDEV_LOCK(wdev); -	if (WARN_ON(wdev->connect_keys)) { -		kzfree(wdev->connect_keys); -		wdev->connect_keys = NULL; +	/* +	 * If we have an ssid_len, we're trying to connect or are +	 * already connected, so reject a new SSID unless it's the +	 * same (which is the case for re-association.) +	 */ +	if (wdev->ssid_len && +	    (wdev->ssid_len != connect->ssid_len || +	     memcmp(wdev->ssid, connect->ssid, wdev->ssid_len))) +		return -EALREADY; + +	/* +	 * If connected, reject (re-)association unless prev_bssid +	 * matches the current BSSID. +	 */ +	if (wdev->current_bss) { +		if (!prev_bssid) +			return -EALREADY; +		if (!ether_addr_equal(prev_bssid, wdev->current_bss->pub.bssid)) +			return -ENOTCONN;  	} +	/* +	 * Reject if we're in the process of connecting with WEP, +	 * this case isn't very interesting and trying to handle +	 * it would make the code much more complex. +	 */ +	if (wdev->connect_keys) +		return -EINPROGRESS; +  	cfg80211_oper_and_ht_capa(&connect->ht_capa_mask,  				  rdev->wiphy.ht_capa_mod_mask); @@ -1118,7 +1138,12 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,  	if (err) {  		wdev->connect_keys = NULL; -		wdev->ssid_len = 0; +		/* +		 * This could be reassoc getting refused, don't clear +		 * ssid_len in that case. +		 */ +		if (!wdev->current_bss) +			wdev->ssid_len = 0;  		return err;  	} @@ -1145,6 +1170,14 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev,  	else if (wdev->ssid_len)  		err = rdev_disconnect(rdev, dev, reason); +	/* +	 * Clear ssid_len unless we actually were fully connected, +	 * in which case cfg80211_disconnected() will take care of +	 * this later. +	 */ +	if (!wdev->current_bss) +		wdev->ssid_len = 0; +  	return err;  } diff --git a/net/wireless/sysfs.h b/net/wireless/sysfs.h index b533ed71daff..7b454c2de9b7 100644 --- a/net/wireless/sysfs.h +++ b/net/wireless/sysfs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __WIRELESS_SYSFS_H  #define __WIRELESS_SYSFS_H diff --git a/net/wireless/trace.h b/net/wireless/trace.h index 0f8db41eaddb..f3353fe5b35b 100644 --- a/net/wireless/trace.h +++ b/net/wireless/trace.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #undef TRACE_SYSTEM  #define TRACE_SYSTEM cfg80211 diff --git a/net/wireless/util.c b/net/wireless/util.c index bcb1284c3415..c1238d582fd1 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Wireless utility functions   * diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index 5d4a02c7979b..7ca04a7de85a 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * cfg80211 - wext compat code   * diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c index c434f193f39a..c67d7a82ab13 100644 --- a/net/wireless/wext-sme.c +++ b/net/wireless/wext-sme.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * cfg80211 wext compat for managed mode.   *  |