mwifiex: fix large amsdu packets causing firmware hang
authorCathy Luo <cluo@marvell.com>
Thu, 21 Jul 2016 11:00:24 +0000 (16:30 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 18 Aug 2016 13:02:08 +0000 (16:02 +0300)
Sometimes host prepares and downloads a large amsdu packet to firmware
which leads to a memory corruption in firmware.
The reason is __dev_alloc_skb() may allocate larger buffer than required
size. This patch solves the problem by checking "adapter->tx_buf_size"
instead of relying on skb_tailroom().

Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/11n_aggr.c

index dc49c3de1f25db6945942449aaa62580a581e51e..c47d6366875d06c5c0c3ceb2af29f31bd55e5158 100644 (file)
@@ -205,7 +205,8 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
 
        do {
                /* Check if AMSDU can accommodate this MSDU */
-               if (skb_tailroom(skb_aggr) < (skb_src->len + LLC_SNAP_LEN))
+               if ((skb_aggr->len + skb_src->len + LLC_SNAP_LEN) >
+                   adapter->tx_buf_size)
                        break;
 
                skb_src = skb_dequeue(&pra_list->skb_head);