|
@@ -8514,6 +8514,10 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
|
|
|
const u8 *bssid, *ssid;
|
|
|
int err, ssid_len = 0;
|
|
|
|
|
|
+ if (dev->ieee80211_ptr->conn_owner_nlportid &&
|
|
|
+ dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -8636,6 +8640,10 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
|
|
|
u16 reason_code;
|
|
|
bool local_state_change;
|
|
|
|
|
|
+ if (dev->ieee80211_ptr->conn_owner_nlportid &&
|
|
|
+ dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -8683,6 +8691,10 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
|
|
|
u16 reason_code;
|
|
|
bool local_state_change;
|
|
|
|
|
|
+ if (dev->ieee80211_ptr->conn_owner_nlportid &&
|
|
|
+ dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -9512,6 +9524,10 @@ static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
|
|
|
u16 reason;
|
|
|
int ret;
|
|
|
|
|
|
+ if (dev->ieee80211_ptr->conn_owner_nlportid &&
|
|
|
+ dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
if (!info->attrs[NL80211_ATTR_REASON_CODE])
|
|
|
reason = WLAN_REASON_DEAUTH_LEAVING;
|
|
|
else
|