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 #1335: 01_secfix-0.9.3-sizecheck-take3.patch

File 01_secfix-0.9.3-sizecheck-take3.patch, 2.4 kB (added by mrenzmann, 12 years ago)
  • madwifi-0.9.3/net80211/ieee80211_input.c

    old new  
    693693 
    694694                        /* NB: assumes linear (i.e., non-fragmented) skb */ 
    695695 
     696                        /* check length > header */ 
     697                        if (skb->len < sizeof(struct ether_header) + LLC_SNAPFRAMELEN 
     698                            + roundup(sizeof(struct athl2p_tunnel_hdr) - 2, 4) + 2) { 
     699                                IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT, 
     700                                        ni->ni_macaddr, "data", "%s", "decap error"); 
     701                                        vap->iv_stats.is_rx_decap++; 
     702                                IEEE80211_NODE_STAT(ni, rx_decap); 
     703                                goto err; 
     704                        } 
     705 
    696706                        /* get to the tunneled headers */ 
    697707                        ath_hdr = (struct athl2p_tunnel_hdr *) 
    698708                                skb_pull(skb, sizeof(struct ether_header) + LLC_SNAPFRAMELEN); 
    699                         /* ignore invalid frames */ 
    700                         if(ath_hdr == NULL) 
     709                        eh_tmp = (struct ether_header *) 
     710                                skb_pull(skb, roundup(sizeof(struct athl2p_tunnel_hdr) - 2, 4) + 2); 
     711                        /* sanity check for malformed 802.3 length */ 
     712                        frame_len = ntohs(eh_tmp->ether_type); 
     713                        if (skb->len < roundup(sizeof(struct ether_header) + frame_len, 4)) { 
     714                                IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT, 
     715                                        ni->ni_macaddr, "data", "%s", "decap error"); 
     716                                        vap->iv_stats.is_rx_decap++; 
     717                                IEEE80211_NODE_STAT(ni, rx_decap); 
    701718                                goto err; 
    702                          
     719                        } 
     720 
    703721                        /* only implementing FF now. drop all others. */ 
    704722                        if (ath_hdr->proto != ATH_L2TUNNEL_PROTO_FF) { 
    705723                                IEEE80211_DISCARD_MAC(vap, 
     
    712730                        } 
    713731                        vap->iv_stats.is_rx_ffcnt++; 
    714732                         
    715                         /* move past the tunneled header, with alignment */ 
    716                         skb_pull(skb, roundup(sizeof(struct athl2p_tunnel_hdr) - 2, 4) + 2); 
    717  
    718733                        skb1 = skb_clone(skb, GFP_ATOMIC); /* XXX: GFP_ATOMIC is overkill? */ 
    719                         eh_tmp = (struct ether_header *)skb->data; 
    720  
    721                         /* ether_type must be length*/ 
    722                         frame_len = ntohs(eh_tmp->ether_type); 
    723734 
    724735                        /* we now have 802.3 MAC hdr followed by 802.2 LLC/SNAP. convert to DIX */ 
    725736                        athff_decap(skb); 
     
    729740 
    730741                        /* prepare second tunneled frame */ 
    731742                        skb_pull(skb1, roundup(sizeof(struct ether_header) + frame_len, 4)); 
    732                         eh_tmp = (struct ether_header *)skb1->data; 
    733                         frame_len = ntohs(eh_tmp->ether_type); 
    734743                        athff_decap(skb1); 
    735744 
    736745                        /* deliver the frames */