Changeset 14202


Ignore:
Timestamp:
2009-01-26T15:36:39+01:00 (9 years ago)
Author:
nbd
Message:

madwifi: fix a potential race condition in the wds ap station interface setup/teardown

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/madwifi/patches/370-wdsvap.patch

    r14195 r14202  
    904904  
    905905 /* This is overridden by ath_node_alloc in ath/if_ath.c, and so 
    906 @@ -1134,6 +1145,62 @@ ieee80211_alloc_node(struct ieee80211vap 
     906@@ -1134,6 +1145,65 @@ ieee80211_alloc_node(struct ieee80211vap 
    907907        return ni; 
    908908 } 
     
    958958+               return; 
    959959+ 
     960+       if (!ni->ni_table) 
     961+               return; 
     962+ 
    960963+       ieee80211_ref_node(ni); 
    961964+       ni->ni_subif = ni->ni_vap; 
     
    967970 int 
    968971 #ifdef IEEE80211_DEBUG_REFCNT 
    969 @@ -1553,22 +1620,39 @@ ieee80211_find_rxnode(struct ieee80211co 
     972@@ -1553,22 +1623,39 @@ ieee80211_find_rxnode(struct ieee80211co 
    970973        ((wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == IEEE80211_FC0_SUBTYPE_PS_POLL) 
    971974        struct ieee80211_node_table *nt; 
     
    10161019        IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt); 
    10171020  
    1018 @@ -1596,9 +1680,19 @@ ieee80211_find_txnode_debug(struct ieee8 
     1021@@ -1596,9 +1683,19 @@ ieee80211_find_txnode_debug(struct ieee8 
    10191022 ieee80211_find_txnode(struct ieee80211vap *vap, const u_int8_t *mac) 
    10201023 #endif 
     
    10361039         * The destination address should be in the node table 
    10371040         * unless we are operating in station mode or this is a 
    1038 @@ -1669,6 +1763,11 @@ ieee80211_free_node(struct ieee80211_nod 
     1041@@ -1669,6 +1766,11 @@ ieee80211_free_node(struct ieee80211_nod 
    10391042 { 
    10401043        struct ieee80211vap *vap = ni->ni_vap; 
     
    10481051        node_print_message(IEEE80211_MSG_NODE|IEEE80211_MSG_NODE_REF, 
    10491052                           1 /* show counter */,  
    1050 @@ -1781,22 +1880,6 @@ restart: 
     1053@@ -1781,22 +1883,6 @@ restart: 
    10511054                    jiffies > ni->ni_rxfragstamp + HZ) { 
    10521055                        ieee80211_dev_kfree_skb(&ni->ni_rxfrag); 
     
    10711074                if (ni->ni_associd != 0 || isadhoc) { 
    10721075                        struct ieee80211vap *vap = ni->ni_vap; 
    1073 @@ -2263,6 +2346,36 @@ ieee80211_node_leave_11g(struct ieee8021 
     1076@@ -2263,6 +2349,35 @@ ieee80211_node_leave_11g(struct ieee8021 
    10741077        } 
    10751078 } 
     
    10821085+       struct ieee80211com *ic; 
    10831086+ 
     1087+       /* wait for full initialization before we start the teardown 
     1088+        * otherwise we could leak interfaces */ 
     1089+       while (ni->ni_subif == ni->ni_vap) 
     1090+               schedule(); 
     1091+ 
    10841092+       rtnl_lock(); 
    10851093+       vap = ni->ni_subif; 
    1086 + 
    1087 +       /* if addif is waiting for the timer to fire, cancel! */ 
    1088 +       if (vap == ni->ni_vap) { 
    1089 +               ni->ni_subif = NULL; 
    1090 +               goto done; 
    1091 +       } 
    10921094+ 
    10931095+       if (!vap) 
     
    11081110  * Handle bookkeeping for a station/neighbor leaving 
    11091111  * the bss when operating in ap or adhoc modes. 
    1110 @@ -2279,6 +2392,12 @@ ieee80211_node_leave(struct ieee80211_no 
     1112@@ -2279,6 +2394,12 @@ ieee80211_node_leave(struct ieee80211_no 
    11111113                        ni, "station with aid %d leaves (refcnt %u)", 
    11121114                        IEEE80211_NODE_AID(ni), atomic_read(&ni->ni_refcnt)); 
Note: See TracChangeset for help on using the changeset viewer.