diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-02-21 08:09:30 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-02-29 15:41:34 -0500 |
commit | 43ba7e958f2ca05e4e9171a15402288419289d71 (patch) | |
tree | 15b7a04a7db402dd286f83cc56c21b336189da09 /net/mac80211/cfg.c | |
parent | d46e144b65bf053b25d134ec9f52a38e63e04bb4 (diff) |
mac80211: atomically check whether STA exists already
When a STA structure is added, it is often checked whether it
already exists before adding it. This, however, isn't done
atomically so there is a race condition that could lead to two
STA structures being added with the same MAC address. This
patch changes sta_info_add() to return an ERR_PTR in case
of failure and adds the failure mode -EEXIST when the STA
already exists.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Luis Carlos Cobo <luisca@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/cfg.c')
-rw-r--r-- | net/mac80211/cfg.c | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index a083cc78855e..b0c41a0cee79 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -562,13 +562,6 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, | |||
562 | if (!netif_running(dev)) | 562 | if (!netif_running(dev)) |
563 | return -ENETDOWN; | 563 | return -ENETDOWN; |
564 | 564 | ||
565 | /* XXX: get sta belonging to dev */ | ||
566 | sta = sta_info_get(local, mac); | ||
567 | if (sta) { | ||
568 | sta_info_put(sta); | ||
569 | return -EEXIST; | ||
570 | } | ||
571 | |||
572 | if (params->vlan) { | 565 | if (params->vlan) { |
573 | sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); | 566 | sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); |
574 | 567 | ||
@@ -579,8 +572,8 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, | |||
579 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 572 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
580 | 573 | ||
581 | sta = sta_info_add(local, dev, mac, GFP_KERNEL); | 574 | sta = sta_info_add(local, dev, mac, GFP_KERNEL); |
582 | if (!sta) | 575 | if (IS_ERR(sta)) |
583 | return -ENOMEM; | 576 | return PTR_ERR(sta); |
584 | 577 | ||
585 | sta->dev = sdata->dev; | 578 | sta->dev = sdata->dev; |
586 | if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN || | 579 | if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN || |