diff options
author | Baruch Siach <baruch@tkos.co.il> | 2009-01-04 16:23:01 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-10-05 08:11:43 -0700 |
commit | 52ccbcd1bcbed712bb586c3c17164fe326e89f1a (patch) | |
tree | 8e0da7ede020a51fe626959282602214885991af | |
parent | e6edca0908edee83e00c90a904c5ecaf9d0e5404 (diff) | |
download | lwn-52ccbcd1bcbed712bb586c3c17164fe326e89f1a.tar.gz lwn-52ccbcd1bcbed712bb586c3c17164fe326e89f1a.zip |
enc28j60: fix RX buffer overflow
commit 22692018b93f0782cda5a843cecfffda1854eb8d upstream.
The enc28j60 driver doesn't check whether the length of the packet as reported
by the hardware fits into the preallocated buffer. When stressed, the hardware
may report insanely large packets even tough the "Receive OK" bit is set. Fix
this.
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/net/enc28j60.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c index aa0bf6e1c694..49fc60d7b17c 100644 --- a/drivers/net/enc28j60.c +++ b/drivers/net/enc28j60.c @@ -919,7 +919,7 @@ static void enc28j60_hw_rx(struct net_device *ndev) if (netif_msg_rx_status(priv)) enc28j60_dump_rsv(priv, __FUNCTION__, next_packet, len, rxstat); - if (!RSV_GETBIT(rxstat, RSV_RXOK)) { + if (!RSV_GETBIT(rxstat, RSV_RXOK) || len > MAX_FRAMELEN) { if (netif_msg_rx_err(priv)) dev_err(&ndev->dev, "Rx Error (%04x)\n", rxstat); ndev->stats.rx_errors++; @@ -927,6 +927,8 @@ static void enc28j60_hw_rx(struct net_device *ndev) ndev->stats.rx_crc_errors++; if (RSV_GETBIT(rxstat, RSV_LENCHECKERR)) ndev->stats.rx_frame_errors++; + if (len > MAX_FRAMELEN) + ndev->stats.rx_over_errors++; } else { skb = dev_alloc_skb(len + NET_IP_ALIGN); if (!skb) { |