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>
This commit is contained in:

committed by
John W. Linville

parent
d46e144b65
commit
43ba7e958f
@@ -562,13 +562,6 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
if (!netif_running(dev))
|
||||
return -ENETDOWN;
|
||||
|
||||
/* XXX: get sta belonging to dev */
|
||||
sta = sta_info_get(local, mac);
|
||||
if (sta) {
|
||||
sta_info_put(sta);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
if (params->vlan) {
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
|
||||
|
||||
@@ -579,8 +572,8 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
|
||||
sta = sta_info_add(local, dev, mac, GFP_KERNEL);
|
||||
if (!sta)
|
||||
return -ENOMEM;
|
||||
if (IS_ERR(sta))
|
||||
return PTR_ERR(sta);
|
||||
|
||||
sta->dev = sdata->dev;
|
||||
if (sdata->vif.type == IEEE80211_IF_TYPE_VLAN ||
|
||||
|
Reference in New Issue
Block a user