Changeset 14191


Ignore:
Timestamp:
2009-01-26T01:27:27+01:00 (8 years ago)
Author:
nbd
Message:

madwifi: fix a noderef problem in the mbss vap cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/madwifi/patches/393-mbss_vap_auth.patch

    r14171 r14191  
    9999  
    100100        if (IS_CTL(wh) && !IS_PSPOLL(wh) /*&& !IS_RTS(ah)*/) 
    101 @@ -1426,32 +1475,21 @@ ieee80211_find_rxnode(struct ieee80211co 
     101@@ -1426,32 +1475,24 @@ ieee80211_find_rxnode(struct ieee80211co 
    102102  
    103103        /* XXX check ic_bss first in station mode */ 
     
    120120+                                       ni = ieee80211_ref_node(avp->iv_wdsnode); 
    121121                        } 
     122+                       if (!(vap->iv_flags_ext & IEEE80211_FEXT_WDS)) 
     123+                               return NULL; 
     124+               } else { 
     125+                       return NULL; 
    122126                } 
    123 +               return ni; 
    124127        } 
    125128  
     
    138141 #ifdef IEEE80211_DEBUG_REFCNT 
    139142 EXPORT_SYMBOL(ieee80211_find_rxnode_debug); 
    140 @@ -1476,15 +1514,14 @@ ieee80211_find_txnode(struct ieee80211va 
     143@@ -1476,15 +1517,14 @@ ieee80211_find_txnode(struct ieee80211va 
    141144        struct ieee80211com *ic = vap->iv_ic; 
    142145        struct ieee80211_node_table *nt; 
     
    155158        /* 
    156159         * The destination address should be in the node table 
    157 @@ -1502,11 +1539,22 @@ ieee80211_find_txnode(struct ieee80211va 
     160@@ -1502,11 +1542,22 @@ ieee80211_find_txnode(struct ieee80211va 
    158161        /* XXX: Can't hold lock across dup_bss due to recursive locking. */ 
    159162        nt = &vap->iv_ic->ic_sta; 
     
    180183  
    181184        if (ni == NULL) { 
    182 @@ -1961,13 +2009,29 @@ remove_worse_nodes(void *arg, struct iee 
     185@@ -1961,13 +2012,29 @@ remove_worse_nodes(void *arg, struct iee 
    183186                } 
    184187 } 
     
    212215--- a/net80211/ieee80211_input.c 
    213216+++ b/net80211/ieee80211_input.c 
    214 @@ -227,15 +227,22 @@ ieee80211_input(struct ieee80211vap * va 
    215         if (!dev) 
    216                 goto out; 
    217   
     217@@ -216,16 +216,14 @@ ieee80211_input(struct ieee80211vap * va 
     218  
     219        type = -1;                      /* undefined */ 
     220  
     221-       if (!vap) 
     222-               goto out; 
     223+       if (!vap || !vap->iv_bss || !vap->iv_dev || !vap->iv_ic) 
     224+               goto discard; 
     225  
     226        ic = vap->iv_ic; 
     227-       if (!ic) 
     228-               goto out; 
     229- 
     230        dev = vap->iv_dev; 
     231-       if (!dev) 
     232-               goto out; 
     233+ 
    218234+       if ((vap->iv_dev->flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) 
    219 +               goto out; 
    220 + 
    221 +       if (!vap->iv_bss) 
    222 +               goto out; 
    223 + 
     235+               goto discard; 
     236  
    224237        /* initialize ni as in the previous API */ 
    225238        if (ni_or_null == NULL) { 
    226                 /* This function does not 'own' vap->iv_bss, so we cannot 
     239@@ -233,9 +231,10 @@ ieee80211_input(struct ieee80211vap * va 
    227240                 * guarantee its existence during the following call, hence 
    228241                 * briefly grab our own reference. */ 
     
    237250        KASSERT(skb->len >= sizeof(struct ieee80211_frame_min), 
    238251                ("frame length too short: %u", skb->len)); 
    239 @@ -933,16 +940,23 @@ int 
     252@@ -848,10 +847,11 @@ ieee80211_input(struct ieee80211vap * va 
     253 err: 
     254        vap->iv_devstats.rx_errors++; 
     255 out: 
     256-       if (skb != NULL) 
     257-               ieee80211_dev_kfree_skb(&skb); 
     258        if (ni_or_null == NULL) 
     259                ieee80211_unref_node(&ni); 
     260+discard: 
     261+       if (skb != NULL) 
     262+               ieee80211_dev_kfree_skb(&skb); 
     263        return type; 
     264 #undef HAS_SEQ 
     265 } 
     266@@ -933,16 +933,23 @@ int 
    240267 ieee80211_input_all(struct ieee80211com *ic, 
    241268        struct sk_buff *skb, int rssi, u_int64_t rtsf) 
     
    261288                        skb1 = skb_copy(skb, GFP_ATOMIC); 
    262289                        if (skb1 == NULL) { 
    263 @@ -954,8 +968,10 @@ ieee80211_input_all(struct ieee80211com  
     290@@ -954,8 +961,10 @@ ieee80211_input_all(struct ieee80211com  
    264291                        skb1 = skb; 
    265292                        skb = NULL; 
     
    273300                ieee80211_dev_kfree_skb(&skb); 
    274301        return type; 
    275 @@ -1146,11 +1162,9 @@ ieee80211_deliver_data(struct ieee80211_ 
     302@@ -1146,11 +1155,9 @@ ieee80211_deliver_data(struct ieee80211_ 
    276303                         * sending it will not work; just let it be 
    277304                         * delivered normally. 
Note: See TracChangeset for help on using the changeset viewer.