Module Name: src
Committed By: kiyohara
Date: Sat Nov 28 12:16:57 UTC 2009
Modified Files:
src/sys/dev/ic: lan9118.c
Log Message:
Check mbuf size and buffers.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/ic/lan9118.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/ic/lan9118.c
diff -u src/sys/dev/ic/lan9118.c:1.3 src/sys/dev/ic/lan9118.c:1.4
--- src/sys/dev/ic/lan9118.c:1.3 Sat Nov 28 08:44:00 2009
+++ src/sys/dev/ic/lan9118.c Sat Nov 28 12:16:57 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: lan9118.c,v 1.3 2009/11/28 08:44:00 kiyohara Exp $ */
+/* $NetBSD: lan9118.c,v 1.4 2009/11/28 12:16:57 kiyohara Exp $ */
/*
* Copyright (c) 2008 KIYOHARA Takashi
* All rights reserved.
@@ -25,7 +25,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lan9118.c,v 1.3 2009/11/28 08:44:00 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lan9118.c,v 1.4 2009/11/28 12:16:57 kiyohara Exp $");
/*
* The LAN9118 Family
@@ -360,6 +360,7 @@
unsigned tdfree, totlen, dso;
uint32_t txa, txb;
uint8_t *p;
+ int n;
DPRINTFN(3, ("%s\n", __func__));
@@ -389,6 +390,33 @@
* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET.
*/
+ /*
+ * Check mbuf chain -- "middle" buffers must be >= 4 bytes
+ * and maximum # of buffers is 86.
+ */
+ m = m0;
+ n = 0;
+ while (m) {
+ if (m->m_len < 4 || ++n > 86) {
+ /* Copy mbuf chain. */
+ MGETHDR(m, M_DONTWAIT, MT_DATA);
+ if (m == NULL)
+ goto discard; /* discard packet */
+ MCLGET(m, M_DONTWAIT);
+ if ((m->m_flags & M_EXT) == 0) {
+ m_freem(m);
+ goto discard; /* discard packet */
+ }
+ m_copydata(m0, 0, m0->m_pkthdr.len,
+ mtod(m, void *));
+ m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len;
+ m_freem(m0);
+ m0 = m;
+ break;
+ }
+ m = m->m_next;
+ }
+
m = m0;
totlen = m->m_pkthdr.len;
p = mtod(m, uint8_t *);
@@ -404,11 +432,6 @@
LAN9118_TXDFIFOP, txa);
bus_space_write_4(sc->sc_iot, sc->sc_ioh,
LAN9118_TXDFIFOP, txb);
- /*
- * XXXX:
- * We are assuming that the size of mbus always align
- * in 4 bytes.
- */
bus_space_write_multi_4(sc->sc_iot, sc->sc_ioh,
LAN9118_TXDFIFOP, (uint32_t *)(p - dso),
(m->m_len + dso + 3) >> 2);
@@ -428,6 +451,8 @@
bus_space_write_multi_4(sc->sc_iot, sc->sc_ioh,
LAN9118_TXDFIFOP, (uint32_t *)(p - dso),
(m->m_len + dso + 3) >> 2);
+
+discard:
#if NBPFILTER > 0
/*
* Pass the packet to any BPF listeners.