bgmac: add check for oversized packets
authorFelix Fietkau <nbd@openwrt.org>
Tue, 14 Apr 2015 10:07:58 +0000 (12:07 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Apr 2015 18:57:11 +0000 (14:57 -0400)
In very rare cases, the MAC can catch an internal buffer that is bigger
than it's supposed to be. Instead of crashing the kernel, simply pass
the buffer back to the hardware

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bgmac.c

index 60b5c3ca8551c489ba4ec83235ceba16f8a5b1c1..5a20108c80e54e24df3ea00300467d5497e22ee0 100644 (file)
@@ -445,6 +445,13 @@ static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
                                break;
                        }
 
+                       if (len > BGMAC_RX_ALLOC_SIZE) {
+                               bgmac_err(bgmac, "Found oversized packet at slot %d, DMA issue!\n",
+                                         ring->start);
+                               put_page(virt_to_head_page(buf));
+                               break;
+                       }
+
                        /* Omit CRC. */
                        len -= ETH_FCS_LEN;