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.

Reply via email to