diff options
Diffstat (limited to 'net/wireless/mlme.c')
-rw-r--r-- | net/wireless/mlme.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index 1b2ca1fea7a1..8e4ce2fdf862 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c | |||
@@ -328,7 +328,8 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
328 | enum nl80211_auth_type auth_type, | 328 | enum nl80211_auth_type auth_type, |
329 | const u8 *bssid, | 329 | const u8 *bssid, |
330 | const u8 *ssid, int ssid_len, | 330 | const u8 *ssid, int ssid_len, |
331 | const u8 *ie, int ie_len) | 331 | const u8 *ie, int ie_len, |
332 | const u8 *key, int key_len, int key_idx) | ||
332 | { | 333 | { |
333 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 334 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
334 | struct cfg80211_auth_request req; | 335 | struct cfg80211_auth_request req; |
@@ -337,6 +338,10 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
337 | 338 | ||
338 | ASSERT_WDEV_LOCK(wdev); | 339 | ASSERT_WDEV_LOCK(wdev); |
339 | 340 | ||
341 | if (auth_type == NL80211_AUTHTYPE_SHARED_KEY) | ||
342 | if (!key || !key_len || key_idx < 0 || key_idx > 4) | ||
343 | return -EINVAL; | ||
344 | |||
340 | if (wdev->current_bss && | 345 | if (wdev->current_bss && |
341 | memcmp(bssid, wdev->current_bss->pub.bssid, ETH_ALEN) == 0) | 346 | memcmp(bssid, wdev->current_bss->pub.bssid, ETH_ALEN) == 0) |
342 | return -EALREADY; | 347 | return -EALREADY; |
@@ -359,6 +364,9 @@ int __cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
359 | req.auth_type = auth_type; | 364 | req.auth_type = auth_type; |
360 | req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, | 365 | req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, |
361 | WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); | 366 | WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); |
367 | req.key = key; | ||
368 | req.key_len = key_len; | ||
369 | req.key_idx = key_idx; | ||
362 | if (!req.bss) | 370 | if (!req.bss) |
363 | return -ENOENT; | 371 | return -ENOENT; |
364 | 372 | ||
@@ -396,13 +404,15 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, | |||
396 | struct net_device *dev, struct ieee80211_channel *chan, | 404 | struct net_device *dev, struct ieee80211_channel *chan, |
397 | enum nl80211_auth_type auth_type, const u8 *bssid, | 405 | enum nl80211_auth_type auth_type, const u8 *bssid, |
398 | const u8 *ssid, int ssid_len, | 406 | const u8 *ssid, int ssid_len, |
399 | const u8 *ie, int ie_len) | 407 | const u8 *ie, int ie_len, |
408 | const u8 *key, int key_len, int key_idx) | ||
400 | { | 409 | { |
401 | int err; | 410 | int err; |
402 | 411 | ||
403 | wdev_lock(dev->ieee80211_ptr); | 412 | wdev_lock(dev->ieee80211_ptr); |
404 | err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, | 413 | err = __cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, |
405 | ssid, ssid_len, ie, ie_len); | 414 | ssid, ssid_len, ie, ie_len, |
415 | key, key_len, key_idx); | ||
406 | wdev_unlock(dev->ieee80211_ptr); | 416 | wdev_unlock(dev->ieee80211_ptr); |
407 | 417 | ||
408 | return err; | 418 | return err; |