mac80211: fix ieee80211_ioctl_giwrate

The ieee80211_ioctl_giwrate() ioctl handler doesn't rcu_read_lock()
its access to the sta table, fix it.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Johannes Berg 2008-04-04 23:40:35 +02:00 committed by John W. Linville
parent bebb8a5e2c
commit 380a942b91

View File

@ -586,19 +586,25 @@ static int ieee80211_ioctl_giwrate(struct net_device *dev,
sdata = IEEE80211_DEV_TO_SUB_IF(dev); sdata = IEEE80211_DEV_TO_SUB_IF(dev);
if (sdata->vif.type == IEEE80211_IF_TYPE_STA) if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
sta = sta_info_get(local, sdata->u.sta.bssid);
else
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (!sta)
return -ENODEV;
sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
if (sta->txrate_idx < sband->n_bitrates) rcu_read_lock();
sta = sta_info_get(local, sdata->u.sta.bssid);
if (sta && sta->txrate_idx < sband->n_bitrates)
rate->value = sband->bitrates[sta->txrate_idx].bitrate; rate->value = sband->bitrates[sta->txrate_idx].bitrate;
else else
rate->value = 0; rate->value = 0;
rcu_read_unlock();
if (!sta)
return -ENODEV;
rate->value *= 100000; rate->value *= 100000;
return 0; return 0;