Changeset 1409

Show
Ignore:
Timestamp:
01/23/06 11:16:49 (3 years ago)
Author:
svens
Message:

Add sanity checks to ieee80211_recv_mgmt(): check boundaries of
elements before accessing it, and also ignore packets where the sum of
all single element lengths is greater than the whole packet.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/net80211/ieee80211_input.c

    r1357 r1409  
    22522252 
    22532253                while (frm < efrm) { 
     2254                        IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]); 
    22542255                        switch (*frm) { 
    22552256                        case IEEE80211_ELEMID_SSID: 
     
    23232324                        frm += frm[1] + 2; 
    23242325                } 
     2326                if(frm > efrm) 
     2327                        return; 
    23252328                IEEE80211_VERIFY_ELEMENT(scan.rates, IEEE80211_RATE_MAXSIZE); 
    23262329                IEEE80211_VERIFY_ELEMENT(scan.ssid, IEEE80211_NWID_LEN); 
     
    25202523                while (frm < efrm) { 
    25212524                        switch (*frm) { 
     2525                                IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]); 
    25222526                        case IEEE80211_ELEMID_SSID: 
    25232527                                ssid = frm; 
     
    25372541                        frm += frm[1] + 2; 
    25382542                } 
     2543                if(frm > efrm) 
     2544                        return; 
    25392545                IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 
    25402546                IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); 
     
    27182724                ssid = rates = xrates = wpa = rsn = wme = ath = NULL; 
    27192725                while (frm < efrm) { 
     2726                        IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]); 
    27202727                        switch (*frm) { 
    27212728                        case IEEE80211_ELEMID_SSID: 
     
    27592766                        frm += frm[1] + 2; 
    27602767                } 
     2768                if(frm > efrm) 
     2769                        return; 
    27612770                IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 
    27622771                IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); 
     
    29983007                while (frm < efrm) { 
    29993008                        switch (*frm) { 
     3009                                IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1]); 
    30003010                        case IEEE80211_ELEMID_RATES: 
    30013011                                rates = frm; 
     
    30113021                        frm += frm[1] + 2; 
    30123022                } 
    3013  
     3023                if(frm > efrm) 
     3024                        return; 
    30143025                IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); 
    30153026                rate = ieee80211_setup_rates(ni, rates, xrates,