p54spi: compensate firmware alignment bug in p54spi_rx
authorMax Filippov <jcmvbkbc@gmail.com>
Fri, 27 Mar 2009 04:50:53 +0000 (07:50 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Apr 2009 20:54:27 +0000 (16:54 -0400)
Firmware may insert up to 4 padding bytes after the lmac header,
but it does not amend the size of SPI data transfer.
Such packets has correct data size in header, thus referencing
past the end of allocated skb. Put extra 4 bytes to the end of the
received skb to compensate for this case.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Acked-by: Christian Lamparter <chunkeey@web.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/p54/p54spi.c

index f8af0961018039416d25a6a0928b833c4d3c943f..52023127cf377cea991b7a8b5e5d887b3bde45cb 100644 (file)
@@ -395,7 +395,12 @@ static int p54spi_rx(struct p54s_priv *priv)
                return 0;
        }
 
-       skb = dev_alloc_skb(len);
+
+       /* Firmware may insert up to 4 padding bytes after the lmac header,
+        * but it does not amend the size of SPI data transfer.
+        * Such packets has correct data size in header, thus referencing
+        * past the end of allocated skb. Reserve extra 4 bytes for this case */
+       skb = dev_alloc_skb(len + 4);
        if (!skb) {
                dev_err(&priv->spi->dev, "could not alloc skb");
                return 0;
@@ -403,6 +408,9 @@ static int p54spi_rx(struct p54s_priv *priv)
 
        p54spi_spi_read(priv, SPI_ADRS_DMA_DATA, skb_put(skb, len), len);
        p54spi_sleep(priv);
+       /* Put additional bytes to compensate for the possible
+        * alignment-caused truncation */
+       skb_put(skb, 4);
 
        if (p54_rx(priv->hw, skb) == 0)
                dev_kfree_skb(skb);