Ticket #428: len-check.diff
File len-check.diff, 2.3 kB (added by svens, 16 years ago) |
---|
-
net80211/ieee80211_input.c
old new 2272 2272 scan.bchan = ieee80211_chan2ieee(ic, ic->ic_curchan); 2273 2273 scan.chan = scan.bchan; 2274 2274 2275 while (frm < efrm ) {2276 IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]);2275 while (frm < efrm && frm[1] < efrm - frm) { 2276 2277 2277 switch (*frm) { 2278 2278 case IEEE80211_ELEMID_SSID: 2279 2279 scan.ssid = frm; … … 2343 2343 } 2344 2344 frm += frm[1] + 2; 2345 2345 } 2346 if (frm > efrm) 2347 return; 2346 2348 2347 IEEE80211_VERIFY_ELEMENT(scan.rates, IEEE80211_RATE_MAXSIZE); 2349 2348 IEEE80211_VERIFY_ELEMENT(scan.ssid, IEEE80211_NWID_LEN); 2350 2349 #if IEEE80211_CHAN_MAX < 255 … … 2538 2537 * [tlv] Atheros Advanced Capabilities 2539 2538 */ 2540 2539 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) { 2543 2541 switch (*frm) { 2544 2542 case IEEE80211_ELEMID_SSID: 2545 2543 ssid = frm; … … 2558 2556 } 2559 2557 frm += frm[1] + 2; 2560 2558 } 2561 if (frm > efrm) 2562 return; 2559 2563 2560 IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 2564 2561 IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); 2565 2562 IEEE80211_VERIFY_SSID(vap->iv_bss, ssid); … … 2742 2739 if (reassoc) 2743 2740 frm += 6; /* ignore current AP info */ 2744 2741 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) { 2747 2743 switch (*frm) { 2748 2744 case IEEE80211_ELEMID_SSID: 2749 2745 ssid = frm; … … 2785 2781 } 2786 2782 frm += frm[1] + 2; 2787 2783 } 2788 if (frm > efrm) 2789 return; 2784 2790 2785 IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 2791 2786 IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); 2792 2787 IEEE80211_VERIFY_SSID(vap->iv_bss, ssid); … … 3024 3019 frm += 2; 3025 3020 3026 3021 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 3029 3024 switch (*frm) { 3030 3025 case IEEE80211_ELEMID_RATES: 3031 3026 rates = frm; … … 3040 3035 } 3041 3036 frm += frm[1] + 2; 3042 3037 } 3043 if (frm > efrm) 3044 return; 3038 3045 3039 IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 3046 3040 rate = ieee80211_setup_rates(ni, rates, xrates, 3047 3041 IEEE80211_F_DOSORT | IEEE80211_F_DOFRATE |