Please note: This project is no longer active. The website is kept online for historic purposes only.
If you´re looking for a Linux driver for your Atheros WLAN device, you should continue here .

Ticket #428: len-check.diff

File len-check.diff, 2.3 kB (added by svens, 16 years ago)
  • net80211/ieee80211_input.c

    old new  
    22722272                scan.bchan = ieee80211_chan2ieee(ic, ic->ic_curchan); 
    22732273                scan.chan = scan.bchan; 
    22742274 
    2275                 while (frm < efrm) { 
    2276                         IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]); 
     2275                while (frm < efrm && frm[1] < efrm - frm) { 
     2276                         
    22772277                        switch (*frm) { 
    22782278                        case IEEE80211_ELEMID_SSID: 
    22792279                                scan.ssid = frm; 
     
    23432343                        } 
    23442344                        frm += frm[1] + 2; 
    23452345                } 
    2346                 if (frm > efrm) 
    2347                         return; 
     2346 
    23482347                IEEE80211_VERIFY_ELEMENT(scan.rates, IEEE80211_RATE_MAXSIZE); 
    23492348                IEEE80211_VERIFY_ELEMENT(scan.ssid, IEEE80211_NWID_LEN); 
    23502349#if IEEE80211_CHAN_MAX < 255 
     
    25382537                 *      [tlv] Atheros Advanced Capabilities 
    25392538                 */ 
    25402539                ssid = rates = xrates = ath = NULL; 
    2541                 while (frm < efrm) { 
    2542                         IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]); 
     2540                while (frm < efrm && frm[1] < efrm - frm) { 
    25432541                        switch (*frm) { 
    25442542                        case IEEE80211_ELEMID_SSID: 
    25452543                                ssid = frm; 
     
    25582556                        } 
    25592557                        frm += frm[1] + 2; 
    25602558                } 
    2561                 if (frm > efrm) 
    2562                         return; 
     2559 
    25632560                IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 
    25642561                IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); 
    25652562                IEEE80211_VERIFY_SSID(vap->iv_bss, ssid); 
     
    27422739                if (reassoc) 
    27432740                        frm += 6;       /* ignore current AP info */ 
    27442741                ssid = rates = xrates = wpa = rsn = wme = ath = NULL; 
    2745                 while (frm < efrm) { 
    2746                         IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]); 
     2742                while (frm < efrm && frm[1] < efrm - frm) { 
    27472743                        switch (*frm) { 
    27482744                        case IEEE80211_ELEMID_SSID: 
    27492745                                ssid = frm; 
     
    27852781                        } 
    27862782                        frm += frm[1] + 2; 
    27872783                } 
    2788                 if (frm > efrm) 
    2789                         return; 
     2784 
    27902785                IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 
    27912786                IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); 
    27922787                IEEE80211_VERIFY_SSID(vap->iv_bss, ssid); 
     
    30243019                frm += 2; 
    30253020 
    30263021                rates = xrates = wme = NULL; 
    3027                 while (frm < efrm) { 
    3028                        IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]); 
     3022                while (frm < efrm && frm[1] < efrm - frm) { 
     3023                 
    30293024                        switch (*frm) { 
    30303025                        case IEEE80211_ELEMID_RATES: 
    30313026                                rates = frm; 
     
    30403035                        } 
    30413036                        frm += frm[1] + 2; 
    30423037                } 
    3043                 if (frm > efrm) 
    3044                         return; 
     3038 
    30453039                IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 
    30463040                rate = ieee80211_setup_rates(ni, rates, xrates, 
    30473041                        IEEE80211_F_DOSORT | IEEE80211_F_DOFRATE |