mac80211: Fix possible race between sta_unblock and network softirq
authorHelmut Schaa <helmut.schaa@googlemail.com>
Tue, 17 Jan 2012 08:22:49 +0000 (09:22 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 17 Jan 2012 15:12:27 +0000 (10:12 -0500)
All other code paths in sta_unblock synchronize with the network
softirq by using local_bh_disable/enable. Do the same around
ieee80211_sta_ps_deliver_wakeup.

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/sta_info.c

index 3c428d4839c7c5cca61ba535197068f3b5c10dbd..ff11f6bf8266dc1a01b1b16330b416a054d702de 100644 (file)
@@ -238,9 +238,11 @@ static void sta_unblock(struct work_struct *wk)
        if (sta->dead)
                return;
 
-       if (!test_sta_flag(sta, WLAN_STA_PS_STA))
+       if (!test_sta_flag(sta, WLAN_STA_PS_STA)) {
+               local_bh_disable();
                ieee80211_sta_ps_deliver_wakeup(sta);
-       else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL)) {
+               local_bh_enable();
+       } else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL)) {
                clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
 
                local_bh_disable();