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 #1270: madwifi-divzero.diff

File madwifi-divzero.diff, 4.5 kB (added by mentor, 12 years ago)

Proposed Fix

  • net80211/ieee80211_crypto.c

    old new  
    529529        KASSERT(cip != NULL, ("No cipher!")); 
    530530 
    531531        IEEE80211_DPRINTF(vap, IEEE80211_MSG_CRYPTO, 
    532                 "%s: %s keyix %u flags 0x%x mac %s  tsc %llu len %u\n", 
     532                "%s: %s keyix %u flags 0x%x mac %s tsc %llu len %u\n", 
    533533                __func__, cip->ic_name, key->wk_keyix, 
    534534                key->wk_flags, ether_sprintf(macaddr), 
    535535                key->wk_keytsc, key->wk_keylen); 
  • net80211/ieee80211_node.c

    old new  
    664664        memcpy(ni->ni_essid, se->se_ssid + 2, ni->ni_esslen); 
    665665        ni->ni_rstamp = se->se_rstamp; 
    666666        ni->ni_tstamp.tsf = se->se_tstamp.tsf; 
    667         ni->ni_intval = se->se_intval
     667        ni->ni_intval = IEEE80211_BINTVAL_SANITISE(se->se_intval)
    668668        ni->ni_capinfo = se->se_capinfo; 
    669669        ni->ni_chan = se->se_chan; 
    670670        ni->ni_timoff = se->se_timoff; 
     
    12191219                memcpy(ni->ni_essid, sp->ssid + 2, sp->ssid[1]); 
    12201220                IEEE80211_ADDR_COPY(ni->ni_bssid, wh->i_addr3); 
    12211221                memcpy(ni->ni_tstamp.data, sp->tstamp, sizeof(ni->ni_tstamp)); 
    1222                 ni->ni_intval = sp->bintval
     1222                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(sp->bintval)
    12231223                ni->ni_capinfo = sp->capinfo; 
    12241224                ni->ni_chan = ic->ic_curchan; 
    12251225                ni->ni_fhdwell = sp->fhdwell; 
  • net80211/ieee80211_scan.h

    old new  
    130130        u_int8_t bchan; 
    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; 
    136136        u_int8_t *tstamp; 
  • net80211/ieee80211_wireless.c

    old new  
    12711271                case IW_POWER_UNICAST_R: 
    12721272                case IW_POWER_ALL_R: 
    12731273                case IW_POWER_ON: 
    1274                         ic->ic_flags |= IEEE80211_F_PMGTON; 
    1275                          
     1274                        if (wrq->flags & IW_POWER_PERIOD) { 
     1275                                if (IEEE80211_BINTVAL_VALID(wrq->value)) 
     1276                                        ic->ic_lintval = IEEE80211_MS_TO_TU(wrq->value); 
     1277                                else 
     1278                                        return -EINVAL; 
     1279                        } 
    12761280                        if (wrq->flags & IW_POWER_TIMEOUT) 
    12771281                                ic->ic_holdover = IEEE80211_MS_TO_TU(wrq->value); 
    1278                         if (wrq->flags & IW_POWER_PERIOD) 
    1279                                ic->ic_lintval = IEEE80211_MS_TO_TU(wrq->value)
     1282                         
     1283                        ic->ic_flags |= IEEE80211_F_PMGTON
    12801284                        break; 
    12811285                default: 
    12821286                        return -EINVAL; 
     
    23592363                if (vap->iv_opmode != IEEE80211_M_HOSTAP && 
    23602364                    vap->iv_opmode != IEEE80211_M_IBSS) 
    23612365                        return -EINVAL; 
    2362                 if (IEEE80211_BINTVAL_MIN <= value && 
    2363                     value <= IEEE80211_BINTVAL_MAX) { 
     2366                if (IEEE80211_BINTVAL_VALID(value)) { 
    23642367                        ic->ic_lintval = value;         /* XXX multi-bss */ 
    23652368                        retv = ENETRESET;               /* requires restart */ 
    23662369                } else 
  • net80211/ieee80211_input.c

    old new  
    28612861                                IEEE80211_ADDR_COPY(ni->ni_bssid, wh->i_addr3); 
    28622862                                memcpy(ni->ni_tstamp.data, scan.tstamp, 
    28632863                                        sizeof(ni->ni_tstamp)); 
    2864                                 ni->ni_intval = scan.bintval
     2864                                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(scan.bintval)
    28652865                                ni->ni_capinfo = scan.capinfo; 
    28662866                                ni->ni_chan = ic->ic_curchan; 
    28672867                                ni->ni_fhdwell = scan.fhdwell; 
     
    32853285                ni->ni_rssi = rssi; 
    32863286                ni->ni_rstamp = rstamp; 
    32873287                ni->ni_last_rx = jiffies; 
    3288                 ni->ni_intval = bintval
     3288                ni->ni_intval = IEEE80211_BINTVAL_SANITISE(bintval)
    32893289                ni->ni_capinfo = capinfo; 
    32903290                ni->ni_chan = ic->ic_curchan; 
    32913291                ni->ni_fhdwell = vap->iv_bss->ni_fhdwell; 
  • net80211/ieee80211_var.h

    old new  
    6363#define IEEE80211_BINTVAL_MAX   500     /* 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) */ 
    6874#define IEEE80211_BGSCAN_INTVAL_DEFAULT (5*60)  /* default bg scan intvl */