*/
                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) {