aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-04-10 15:36:09 +0200
committerJohn W. Linville <linville@tuxdriver.com>2008-04-16 14:53:22 -0400
commit98dd6a575928ed9c42130d208e6bfb0f7a914d5a (patch)
tree5fd946b2080a8aa68e75742ea958e768cace46cb /net
parentrt2x00: Only free skb when beacon_update fails (diff)
downloadlinux-dev-98dd6a575928ed9c42130d208e6bfb0f7a914d5a.tar.xz
linux-dev-98dd6a575928ed9c42130d208e6bfb0f7a914d5a.zip
mac80211: further RCU fixes
There were a few more instances of sta_info_get calls not being protected by RCU, fix them. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/cfg.c20
-rw-r--r--net/mac80211/wext.c5
2 files changed, 22 insertions, 3 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 8af576c1d2f1..0c1095aa94dd 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -718,12 +718,18 @@ static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
struct sta_info *sta;
if (mac) {
+ rcu_read_lock();
+
/* XXX: get sta belonging to dev */
sta = sta_info_get(local, mac);
- if (!sta)
+ if (!sta) {
+ rcu_read_unlock();
return -ENOENT;
+ }
sta_info_unlink(&sta);
+ rcu_read_unlock();
+
sta_info_destroy(sta);
} else
sta_info_flush(local, sdata);
@@ -740,17 +746,23 @@ static int ieee80211_change_station(struct wiphy *wiphy,
struct sta_info *sta;
struct ieee80211_sub_if_data *vlansdata;
+ rcu_read_lock();
+
/* XXX: get sta belonging to dev */
sta = sta_info_get(local, mac);
- if (!sta)
+ if (!sta) {
+ rcu_read_unlock();
return -ENOENT;
+ }
if (params->vlan && params->vlan != sta->sdata->dev) {
vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
if (vlansdata->vif.type != IEEE80211_IF_TYPE_VLAN ||
- vlansdata->vif.type != IEEE80211_IF_TYPE_AP)
+ vlansdata->vif.type != IEEE80211_IF_TYPE_AP) {
+ rcu_read_unlock();
return -EINVAL;
+ }
sta->sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
ieee80211_send_layer2_update(sta);
@@ -758,6 +770,8 @@ static int ieee80211_change_station(struct wiphy *wiphy,
sta_apply_parameters(local, sta, params);
+ rcu_read_unlock();
+
return 0;
}
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c
index 69aed16faff3..5a452575719d 100644
--- a/net/mac80211/wext.c
+++ b/net/mac80211/wext.c
@@ -980,6 +980,8 @@ static struct iw_statistics *ieee80211_get_wireless_stats(struct net_device *dev
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct sta_info *sta = NULL;
+ rcu_read_lock();
+
if (sdata->vif.type == IEEE80211_IF_TYPE_STA ||
sdata->vif.type == IEEE80211_IF_TYPE_IBSS)
sta = sta_info_get(local, sdata->u.sta.bssid);
@@ -996,6 +998,9 @@ static struct iw_statistics *ieee80211_get_wireless_stats(struct net_device *dev
wstats->qual.noise = sta->last_noise;
wstats->qual.updated = local->wstats_flags;
}
+
+ rcu_read_unlock();
+
return wstats;
}