|
@@ -1271,12 +1271,20 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
|
|
|
*/
|
|
|
pkt_len = *((__le16 *)skb_data->data);
|
|
|
rx_len = le16_to_cpu(pkt_len);
|
|
|
- skb_put(skb_data, rx_len);
|
|
|
- dev_dbg(adapter->dev,
|
|
|
- "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
|
|
|
- card->rxbd_rdptr, wrptr, rx_len);
|
|
|
- skb_pull(skb_data, INTF_HEADER_LEN);
|
|
|
- mwifiex_handle_rx_packet(adapter, skb_data);
|
|
|
+ if (WARN_ON(rx_len <= INTF_HEADER_LEN ||
|
|
|
+ rx_len > MWIFIEX_RX_DATA_BUF_SIZE)) {
|
|
|
+ dev_err(adapter->dev,
|
|
|
+ "Invalid RX len %d, Rd=%#x, Wr=%#x\n",
|
|
|
+ rx_len, card->rxbd_rdptr, wrptr);
|
|
|
+ dev_kfree_skb_any(skb_data);
|
|
|
+ } else {
|
|
|
+ skb_put(skb_data, rx_len);
|
|
|
+ dev_dbg(adapter->dev,
|
|
|
+ "info: RECV DATA: Rd=%#x, Wr=%#x, Len=%d\n",
|
|
|
+ card->rxbd_rdptr, wrptr, rx_len);
|
|
|
+ skb_pull(skb_data, INTF_HEADER_LEN);
|
|
|
+ mwifiex_handle_rx_packet(adapter, skb_data);
|
|
|
+ }
|
|
|
|
|
|
skb_tmp = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
|
|
|
if (!skb_tmp) {
|