diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2009-08-07 11:54:07 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-08-14 09:13:44 -0400 |
commit | 5ba63533bbf653631faab60f6988506160ec6ba4 (patch) | |
tree | 8d9ef2670cd3b2f50fe3581820fba5aca365634d /net/mac80211/main.c | |
parent | ad5351db89681515681c5d5659ddf4c69e3cc6f5 (diff) |
cfg80211: fix alignment problem in scan request
The memory layout for scan requests was rather wrong,
we put the scan SSIDs before the channels which could
lead to the channel pointers being unaligned in memory.
It turns out that using a pointer to the channel array
isn't necessary anyway since we can embed a zero-length
array into the struct.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r-- | net/mac80211/main.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 0c4f8e122ed6..b03fd84777fa 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -765,9 +765,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
765 | supp_ht = supp_ht || sband->ht_cap.ht_supported; | 765 | supp_ht = supp_ht || sband->ht_cap.ht_supported; |
766 | } | 766 | } |
767 | 767 | ||
768 | local->int_scan_req.n_channels = channels; | 768 | local->int_scan_req = kzalloc(sizeof(*local->int_scan_req) + |
769 | local->int_scan_req.channels = kzalloc(sizeof(void *) * channels, GFP_KERNEL); | 769 | sizeof(void *) * channels, GFP_KERNEL); |
770 | if (!local->int_scan_req.channels) | 770 | if (!local->int_scan_req) |
771 | return -ENOMEM; | 771 | return -ENOMEM; |
772 | 772 | ||
773 | /* if low-level driver supports AP, we also support VLAN */ | 773 | /* if low-level driver supports AP, we also support VLAN */ |
@@ -882,13 +882,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
882 | 882 | ||
883 | /* alloc internal scan request */ | 883 | /* alloc internal scan request */ |
884 | i = 0; | 884 | i = 0; |
885 | local->int_scan_req.ssids = &local->scan_ssid; | 885 | local->int_scan_req->ssids = &local->scan_ssid; |
886 | local->int_scan_req.n_ssids = 1; | 886 | local->int_scan_req->n_ssids = 1; |
887 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { | 887 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { |
888 | if (!hw->wiphy->bands[band]) | 888 | if (!hw->wiphy->bands[band]) |
889 | continue; | 889 | continue; |
890 | for (j = 0; j < hw->wiphy->bands[band]->n_channels; j++) { | 890 | for (j = 0; j < hw->wiphy->bands[band]->n_channels; j++) { |
891 | local->int_scan_req.channels[i] = | 891 | local->int_scan_req->channels[i] = |
892 | &hw->wiphy->bands[band]->channels[j]; | 892 | &hw->wiphy->bands[band]->channels[j]; |
893 | i++; | 893 | i++; |
894 | } | 894 | } |
@@ -920,7 +920,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
920 | fail_workqueue: | 920 | fail_workqueue: |
921 | wiphy_unregister(local->hw.wiphy); | 921 | wiphy_unregister(local->hw.wiphy); |
922 | fail_wiphy_register: | 922 | fail_wiphy_register: |
923 | kfree(local->int_scan_req.channels); | 923 | kfree(local->int_scan_req->channels); |
924 | return result; | 924 | return result; |
925 | } | 925 | } |
926 | EXPORT_SYMBOL(ieee80211_register_hw); | 926 | EXPORT_SYMBOL(ieee80211_register_hw); |
@@ -962,7 +962,7 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) | |||
962 | wiphy_unregister(local->hw.wiphy); | 962 | wiphy_unregister(local->hw.wiphy); |
963 | ieee80211_wep_free(local); | 963 | ieee80211_wep_free(local); |
964 | ieee80211_led_exit(local); | 964 | ieee80211_led_exit(local); |
965 | kfree(local->int_scan_req.channels); | 965 | kfree(local->int_scan_req); |
966 | } | 966 | } |
967 | EXPORT_SYMBOL(ieee80211_unregister_hw); | 967 | EXPORT_SYMBOL(ieee80211_unregister_hw); |
968 | 968 | ||