Changeset 2736

Show
Ignore:
Timestamp:
10/11/07 17:40:49 (1 year ago)
Author:
mentor
Message:

If a rates information element is received that is larger than we will accept, simply take the first maximum size elements and continue, rather than BUG'ing out.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • madwifi/trunk/net80211/_ieee80211.h

    r2513 r2736  
    226226#define IEEE80211_RATE_SIZE     8               /* 802.11 standard */ 
    227227#define IEEE80211_RATE_MAXSIZE  15              /* max rates we'll handle */ 
     228#define IEEE80211_SANITISE_RATESIZE(_rsz) \ 
     229        ((_rsz > IEEE80211_RATE_MAXSIZE) ? IEEE80211_RATE_MAXSIZE : _rsz) 
    228230 
    229231struct ieee80211_rateset { 
  • madwifi/trunk/net80211/ieee80211_scan_ap.c

    r2731 r2736  
    512512        TAILQ_INSERT_TAIL(&as->as_entry, se, se_list); 
    513513        LIST_INSERT_HEAD(&as->as_hash[hash], se, se_hash); 
     514 
    514515found: 
    515516        ise = &se->base; 
    516         /* XXX ap beaconing multiple ssid w/ same bssid */ 
    517         if (sp->ssid[1] != 0 && 
    518             ((subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) || ise->se_ssid[1] == 0)) 
    519         { 
     517 
     518        /* XXX: AP beaconing multiple SSID w/ same BSSID */ 
     519        if ((sp->ssid[1] != 0) && 
     520            ((subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) ||  
     521             (ise->se_ssid[1] == 0))) 
    520522                memcpy(ise->se_ssid, sp->ssid, 2 + sp->ssid[1]); 
    521         } 
    522         KASSERT(sp->rates[1] <= IEEE80211_RATE_MAXSIZE, 
    523                 ("rate set too large: %u", sp->rates[1])); 
    524         memcpy(ise->se_rates, sp->rates, 2 + sp->rates[1]); 
     523 
     524        memcpy(ise->se_rates, sp->rates,  
     525                IEEE80211_SANITISE_RATESIZE(2 + sp->rates[1])); 
    525526        if (sp->xrates != NULL) { 
    526                 /* XXX validate xrates[1] */ 
    527                 KASSERT(sp->xrates[1] <= IEEE80211_RATE_MAXSIZE, 
    528                         ("xrate set too large: %u", sp->xrates[1])); 
    529                 memcpy(ise->se_xrates, sp->xrates, 2 + sp->xrates[1]); 
     527                memcpy(ise->se_xrates, sp->xrates,  
     528                                IEEE80211_SANITISE_RATESIZE(2 + sp->xrates[1])); 
    530529        } else 
    531530                ise->se_xrates[1] = 0; 
     531 
    532532        IEEE80211_ADDR_COPY(ise->se_bssid, wh->i_addr3); 
    533         /* 
    534          * Record rssi data using extended precision LPF filter. 
    535          */ 
    536         if (se->se_lastupdate == 0)             /* first sample */ 
     533 
     534        /* Record RSSI data using extended precision LPF filter.*/ 
     535        if (se->se_lastupdate == 0)                     /* First sample */ 
    537536                se->se_avgrssi = RSSI_IN(rssi); 
    538         else                                    /* avg w/ previous samples */ 
     537        else                                    /* Avg. w/ previous samples */ 
    539538                RSSI_LPF(se->se_avgrssi, rssi); 
    540539        se->base.se_rssi = RSSI_GET(se->se_avgrssi); 
  • madwifi/trunk/net80211/ieee80211_scan_sta.c

    r2648 r2736  
    248248        TAILQ_INSERT_TAIL(&st->st_entry, se, se_list); 
    249249        LIST_INSERT_HEAD(&st->st_hash[hash], se, se_hash); 
     250 
    250251found: 
    251252        ise = &se->base; 
     253 
    252254        /* XXX ap beaconing multiple ssid w/ same bssid */ 
    253255        if (sp->ssid[1] != 0 && 
    254256            (ISPROBE(subtype) || ise->se_ssid[1] == 0)) 
    255257                memcpy(ise->se_ssid, sp->ssid, 2 + sp->ssid[1]); 
    256         KASSERT(sp->rates[1] <= IEEE80211_RATE_MAXSIZE, 
    257                ("rate set too large: %u", sp->rates[1])); 
    258         memcpy(ise->se_rates, sp->rates, 2 + sp->rates[1]); 
     258 
     259        memcpy(ise->se_rates, sp->rates,  
     260                       2 + IEEE80211_SANITISE_RATESIZE(sp->rates[1])); 
    259261        if (sp->xrates != NULL) { 
    260                 /* XXX validate xrates[1] */ 
    261                 KASSERT(sp->xrates[1] <= IEEE80211_RATE_MAXSIZE, 
    262                         ("xrate set too large: %u", sp->xrates[1])); 
    263                 memcpy(ise->se_xrates, sp->xrates, 2 + sp->xrates[1]); 
     262                memcpy(ise->se_xrates, sp->xrates,  
     263                                2 + IEEE80211_SANITISE_RATESIZE(sp->xrates[1])); 
    264264        } else 
    265265                ise->se_xrates[1] = 0; 
     266 
    266267        IEEE80211_ADDR_COPY(ise->se_bssid, wh->i_addr3); 
    267268        /*