Changeset 2348

Show
Ignore:
Timestamp:
05/18/07 06:58:44 (2 years ago)
Author:
mrenzmann
Message:

Don't accept invalid beacon interval values (such as 0), neither
locally (for AP VAPs) nor from remote (in scanning results). The value
is used as divisor, which might cause an oops due to "division by zero"
and other unwanted behaviour. Closes #1270.

Thanks to Md Sohail Ahmad from AirTight? Networks Inc., who reported
this issue and provided a first patch.

Files:

Legend:

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

    r2339 r2348  
    27682768                        return; 
    27692769                } 
    2770  
     2770                 
     2771                /* IEEE802.11 does not specify the allowed range for  
     2772                 * beacon interval. We discard any beacons with a  
     2773                 * beacon interval outside of an arbitrary range in 
     2774                 * order to protect against attack. 
     2775                 */ 
     2776                if (!(IEEE80211_BINTVAL_MIN <= scan.bintval &&  
     2777                     scan.bintval <= IEEE80211_BINTVAL_MAX)) { 
     2778                        IEEE80211_DISCARD(vap, IEEE80211_MSG_SCAN, 
     2779                                wh, "beacon", "invalid beacon interval (%u)",  
     2780                                scan.bintval); 
     2781                        return; 
     2782                } 
     2783                 
    27712784                /* 
    27722785                 * Count frame now that we know it's to be processed. 
     
    28962909                                memcpy(ni->ni_tstamp.data, scan.tstamp, 
    28972910                                        sizeof(ni->ni_tstamp)); 
    2898                                 ni->ni_intval = scan.bintval
     2911                                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(scan.bintval)
    28992912                                ni->ni_capinfo = scan.capinfo; 
    29002913                                ni->ni_chan = ic->ic_curchan; 
     
    33203333                ni->ni_rstamp = rstamp; 
    33213334                ni->ni_last_rx = jiffies; 
    3322                 ni->ni_intval = bintval
     3335                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(bintval)
    33233336                ni->ni_capinfo = capinfo; 
    33243337                ni->ni_chan = ic->ic_curchan; 
  • trunk/net80211/ieee80211_node.c

    r2334 r2348  
    661661        ni->ni_rstamp = se->se_rstamp; 
    662662        ni->ni_tstamp.tsf = se->se_tstamp.tsf; 
    663         ni->ni_intval = se->se_intval
     663        ni->ni_intval = IEEE80211_BINTVAL_SANITISE(se->se_intval)
    664664        ni->ni_capinfo = se->se_capinfo; 
    665665        ni->ni_chan = se->se_chan; 
     
    12161216                IEEE80211_ADDR_COPY(ni->ni_bssid, wh->i_addr3); 
    12171217                memcpy(ni->ni_tstamp.data, sp->tstamp, sizeof(ni->ni_tstamp)); 
    1218                 ni->ni_intval = sp->bintval
     1218                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(sp->bintval)
    12191219                ni->ni_capinfo = sp->capinfo; 
    12201220                ni->ni_chan = ic->ic_curchan; 
  • trunk/net80211/ieee80211_scan.h

    r2030 r2348  
    131131        u_int8_t fhindex; 
    132132        u_int8_t erp; 
    133         u_int8_t bintval; 
     133        u_int16_t bintval; 
    134134        u_int8_t timoff; 
    135135        u_int8_t *tim; 
  • trunk/net80211/ieee80211_var.h

    r2314 r2348  
    6161#define IEEE80211_DTIM_DEFAULT  1       /* default DTIM period */ 
    6262 
    63 #define IEEE80211_BINTVAL_MAX   500   /* max beacon interval (TU's) */ 
     63#define IEEE80211_BINTVAL_MAX   1000  /* max beacon interval (TU's) */ 
    6464#define IEEE80211_BINTVAL_MIN   25      /* min beacon interval (TU's) */ 
    6565#define IEEE80211_BINTVAL_DEFAULT 100   /* default beacon interval (TU's) */ 
     66#define IEEE80211_BINTVAL_VALID(_bi) \ 
     67        ((IEEE80211_BINTVAL_MIN <= (_bi)) && \ 
     68         ((_bi) <= IEEE80211_BINTVAL_MAX)) 
     69#define IEEE80211_BINTVAL_SANITISE(_bi) \ 
     70        (IEEE80211_BINTVAL_VALID(_bi) ? \ 
     71         (_bi) : IEEE80211_BINTVAL_DEFAULT) 
    6672 
    6773#define IEEE80211_BGSCAN_INTVAL_MIN     15      /* min bg scan intvl (secs) */ 
  • trunk/net80211/ieee80211_wireless.c

    r2335 r2348  
    12741274                case IW_POWER_ALL_R: 
    12751275                case IW_POWER_ON: 
    1276                         ic->ic_flags |= IEEE80211_F_PMGTON; 
    1277                          
     1276                        if (wrq->flags & IW_POWER_PERIOD) { 
     1277                                if (IEEE80211_BINTVAL_VALID(wrq->value)) 
     1278                                        ic->ic_lintval = IEEE80211_MS_TO_TU(wrq->value); 
     1279                                else 
     1280                                        return -EINVAL; 
     1281                        } 
    12781282                        if (wrq->flags & IW_POWER_TIMEOUT) 
    12791283                                ic->ic_holdover = IEEE80211_MS_TO_TU(wrq->value); 
    1280                         if (wrq->flags & IW_POWER_PERIOD) 
    1281                                ic->ic_lintval = IEEE80211_MS_TO_TU(wrq->value)
     1284                         
     1285                        ic->ic_flags |= IEEE80211_F_PMGTON
    12821286                        break; 
    12831287                default: 
     
    23662370                    vap->iv_opmode != IEEE80211_M_IBSS) 
    23672371                        return -EINVAL; 
    2368                 if (IEEE80211_BINTVAL_MIN <= value && 
    2369                     value <= IEEE80211_BINTVAL_MAX) { 
     2372                if (IEEE80211_BINTVAL_VALID(value)) { 
    23702373                        ic->ic_lintval = value;         /* XXX multi-bss */ 
    23712374                        retv = ENETRESET;               /* requires restart */