| .. | .. |
|---|
| 98 | 98 | rx_pkt_len = le16_to_cpu(local_rx_pd->rx_pkt_length); |
|---|
| 99 | 99 | rx_pkt_hdr = (void *)local_rx_pd + rx_pkt_off; |
|---|
| 100 | 100 | |
|---|
| 101 | | - if ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header, |
|---|
| 102 | | - sizeof(bridge_tunnel_header))) || |
|---|
| 103 | | - (!memcmp(&rx_pkt_hdr->rfc1042_hdr, rfc1042_header, |
|---|
| 104 | | - sizeof(rfc1042_header)) && |
|---|
| 105 | | - ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_AARP && |
|---|
| 106 | | - ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_IPX)) { |
|---|
| 101 | + if (sizeof(rx_pkt_hdr->eth803_hdr) + sizeof(rfc1042_header) + |
|---|
| 102 | + rx_pkt_off > skb->len) { |
|---|
| 103 | + mwifiex_dbg(priv->adapter, ERROR, |
|---|
| 104 | + "wrong rx packet offset: len=%d, rx_pkt_off=%d\n", |
|---|
| 105 | + skb->len, rx_pkt_off); |
|---|
| 106 | + priv->stats.rx_dropped++; |
|---|
| 107 | + dev_kfree_skb_any(skb); |
|---|
| 108 | + return -1; |
|---|
| 109 | + } |
|---|
| 110 | + |
|---|
| 111 | + if (sizeof(*rx_pkt_hdr) + rx_pkt_off <= skb->len && |
|---|
| 112 | + ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header, |
|---|
| 113 | + sizeof(bridge_tunnel_header))) || |
|---|
| 114 | + (!memcmp(&rx_pkt_hdr->rfc1042_hdr, rfc1042_header, |
|---|
| 115 | + sizeof(rfc1042_header)) && |
|---|
| 116 | + ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_AARP && |
|---|
| 117 | + ntohs(rx_pkt_hdr->rfc1042_hdr.snap_type) != ETH_P_IPX))) { |
|---|
| 107 | 118 | /* |
|---|
| 108 | 119 | * Replace the 803 header and rfc1042 header (llc/snap) with an |
|---|
| 109 | 120 | * EthernetII header, keep the src/dst and snap_type |
|---|
| .. | .. |
|---|
| 206 | 217 | |
|---|
| 207 | 218 | rx_pkt_hdr = (void *)local_rx_pd + rx_pkt_offset; |
|---|
| 208 | 219 | |
|---|
| 209 | | - if ((rx_pkt_offset + rx_pkt_length) > (u16) skb->len) { |
|---|
| 220 | + if ((rx_pkt_offset + rx_pkt_length) > skb->len || |
|---|
| 221 | + sizeof(rx_pkt_hdr->eth803_hdr) + rx_pkt_offset > skb->len) { |
|---|
| 210 | 222 | mwifiex_dbg(adapter, ERROR, |
|---|
| 211 | 223 | "wrong rx packet: len=%d, rx_pkt_offset=%d, rx_pkt_length=%d\n", |
|---|
| 212 | 224 | skb->len, rx_pkt_offset, rx_pkt_length); |
|---|