aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-04-04 17:40:35 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-04-08 16:44:43 -0400
commit380a942b9177dcae1429fdd0f3639f92d9ab139d (patch)
tree4ae093002b6fe9289c3d888858b80c35ccab6f6b /net
parentbebb8a5e2cd30adcc5e9a14c3366a231da728aee (diff)
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>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/ieee80211_ioctl.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c
index b047eebb6330..41130b303170 100644
--- a/net/mac80211/ieee80211_ioctl.c
+++ b/net/mac80211/ieee80211_ioctl.c
@@ -586,19 +586,25 @@ static int ieee80211_ioctl_giwrate(struct net_device *dev,
586 586
587 sdata = IEEE80211_DEV_TO_SUB_IF(dev); 587 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
588 588
589 if (sdata->vif.type == IEEE80211_IF_TYPE_STA) 589 if (sdata->vif.type != IEEE80211_IF_TYPE_STA)
590 sta = sta_info_get(local, sdata->u.sta.bssid);
591 else
592 return -EOPNOTSUPP; 590 return -EOPNOTSUPP;
593 if (!sta)
594 return -ENODEV;
595 591
596 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 592 sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
597 593
598 if (sta->txrate_idx < sband->n_bitrates) 594 rcu_read_lock();
595
596 sta = sta_info_get(local, sdata->u.sta.bssid);
597
598 if (sta && sta->txrate_idx < sband->n_bitrates)
599 rate->value = sband->bitrates[sta->txrate_idx].bitrate; 599 rate->value = sband->bitrates[sta->txrate_idx].bitrate;
600 else 600 else
601 rate->value = 0; 601 rate->value = 0;
602
603 rcu_read_unlock();
604
605 if (!sta)
606 return -ENODEV;
607
602 rate->value *= 100000; 608 rate->value *= 100000;
603 609
604 return 0; 610 return 0;