summaryrefslogtreecommitdiffstats
path: root/sys/dev/mxge
diff options
context:
space:
mode:
authorgallatin <gallatin@FreeBSD.org>2006-10-17 14:39:19 +0000
committergallatin <gallatin@FreeBSD.org>2006-10-17 14:39:19 +0000
commit5e3b1e8a37b3b7c4cab982175252e5613e339696 (patch)
tree6a9ea555adee6499b1586957f7bb897a301c3d62 /sys/dev/mxge
parentaa770141457691fd53764698ded55d6c2c181fc6 (diff)
downloadFreeBSD-src-5e3b1e8a37b3b7c4cab982175252e5613e339696.zip
FreeBSD-src-5e3b1e8a37b3b7c4cab982175252e5613e339696.tar.gz
Fix a driver bug which could result in frames MHLEN or (MHLEN - 1) bytes
long being DMA'ed 2 (or 1) bytes past the end of the mbuf and corrupting random kernel memory. I had forgotten about the 2 bytes of implict padding the firmware assumes. Sponsored by: Myricom Inc.
Diffstat (limited to 'sys/dev/mxge')
-rw-r--r--sys/dev/mxge/if_mxge.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c
index 4e2b154..f1ad5b3 100644
--- a/sys/dev/mxge/if_mxge.c
+++ b/sys/dev/mxge/if_mxge.c
@@ -1930,7 +1930,7 @@ mxge_clean_rx_done(mxge_softc_t *sc)
length = ntohs(rx_done->entry[rx_done->idx].length);
rx_done->entry[rx_done->idx].length = 0;
checksum = ntohs(rx_done->entry[rx_done->idx].checksum);
- if (length <= MHLEN)
+ if (length <= (MHLEN - MXGEFW_PAD))
mxge_rx_done_small(sc, length, checksum);
else
mxge_rx_done_big(sc, length, checksum);
@@ -2429,7 +2429,7 @@ mxge_open(mxge_softc_t *sc)
of two. Luckily, FreeBSD's clusters are powers of two */
cmd.data0 = sc->ifp->if_mtu + ETHER_HDR_LEN;
err = mxge_send_cmd(sc, MXGEFW_CMD_SET_MTU, &cmd);
- cmd.data0 = MHLEN;
+ cmd.data0 = MHLEN - MXGEFW_PAD;
err |= mxge_send_cmd(sc, MXGEFW_CMD_SET_SMALL_BUFFER_SIZE,
&cmd);
cmd.data0 = sc->big_bytes;
OpenPOWER on IntegriCloud