Module Name: src Committed By: maxv Date: Fri Jun 1 09:34:39 UTC 2018
Modified Files: src/sys/dev/pci: if_age.c if_alc.c if_ena.c Log Message: Fix M_PKTHDR use in if_alc, if_age and if_ena. if_alc and if_age always put in _rxhead a M_PKTHDR-flagged mbuf, so the flag must always be present. Instead of manually adding the flag, add a KASSERT to ensure it is already there. If it weren't, there would be memory corruptions. Same in if_ena, but this one does not compile so we don't really care. Also, use m_remove_pkthdr to remove the flag, instead of doing it manually. This ensures the tags get freed (even though these drivers don't seem to be using mtags). To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/sys/dev/pci/if_age.c cvs rdiff -u -r1.25 -r1.26 src/sys/dev/pci/if_alc.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/pci/if_ena.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/pci/if_age.c diff -u src/sys/dev/pci/if_age.c:1.51 src/sys/dev/pci/if_age.c:1.52 --- src/sys/dev/pci/if_age.c:1.51 Tue Sep 26 07:42:06 2017 +++ src/sys/dev/pci/if_age.c Fri Jun 1 09:34:39 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_age.c,v 1.51 2017/09/26 07:42:06 knakahara Exp $ */ +/* $NetBSD: if_age.c,v 1.52 2018/06/01 09:34:39 maxv Exp $ */ /* $OpenBSD: if_age.c,v 1.1 2009/01/16 05:00:34 kevlo Exp $ */ /*- @@ -31,7 +31,7 @@ /* Driver for Attansic Technology Corp. L1 Gigabit Ethernet. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.51 2017/09/26 07:42:06 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.52 2018/06/01 09:34:39 maxv Exp $"); #include "vlan.h" @@ -1430,7 +1430,7 @@ age_rxeof(struct age_softc *sc, struct r sc->age_cdata.age_rxhead = mp; sc->age_cdata.age_rxtail = mp; } else { - mp->m_flags &= ~M_PKTHDR; + m_remove_pkthdr(mp); sc->age_cdata.age_rxprev_tail = sc->age_cdata.age_rxtail; sc->age_cdata.age_rxtail->m_next = mp; @@ -1459,7 +1459,7 @@ age_rxeof(struct age_softc *sc, struct r } m = sc->age_cdata.age_rxhead; - m->m_flags |= M_PKTHDR; + KASSERT(m->m_flags & M_PKTHDR); m_set_rcvif(m, ifp); m->m_pkthdr.len = sc->age_cdata.age_rxlen; /* Set the first mbuf length. */ Index: src/sys/dev/pci/if_alc.c diff -u src/sys/dev/pci/if_alc.c:1.25 src/sys/dev/pci/if_alc.c:1.26 --- src/sys/dev/pci/if_alc.c:1.25 Tue Sep 26 07:42:06 2017 +++ src/sys/dev/pci/if_alc.c Fri Jun 1 09:34:39 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_alc.c,v 1.25 2017/09/26 07:42:06 knakahara Exp $ */ +/* $NetBSD: if_alc.c,v 1.26 2018/06/01 09:34:39 maxv Exp $ */ /* $OpenBSD: if_alc.c,v 1.1 2009/08/08 09:31:13 kevlo Exp $ */ /*- * Copyright (c) 2009, Pyun YongHyeon <yong...@freebsd.org> @@ -2537,7 +2537,7 @@ alc_rxeof(struct alc_softc *sc, struct r sc->alc_cdata.alc_rxhead = mp; sc->alc_cdata.alc_rxtail = mp; } else { - mp->m_flags &= ~M_PKTHDR; + m_remove_pkthdr(mp); sc->alc_cdata.alc_rxprev_tail = sc->alc_cdata.alc_rxtail; sc->alc_cdata.alc_rxtail->m_next = mp; @@ -2547,7 +2547,7 @@ alc_rxeof(struct alc_softc *sc, struct r if (count == nsegs - 1) { /* Last desc. for this frame. */ m = sc->alc_cdata.alc_rxhead; - m->m_flags |= M_PKTHDR; + KASSERT(m->m_flags & M_PKTHDR); /* * It seems that L1C/L2C controller has no way * to tell hardware to strip CRC bytes. Index: src/sys/dev/pci/if_ena.c diff -u src/sys/dev/pci/if_ena.c:1.2 src/sys/dev/pci/if_ena.c:1.3 --- src/sys/dev/pci/if_ena.c:1.2 Sat May 19 09:32:55 2018 +++ src/sys/dev/pci/if_ena.c Fri Jun 1 09:34:39 2018 @@ -31,7 +31,7 @@ #if 0 __FBSDID("$FreeBSD: head/sys/dev/ena/ena.c 333456 2018-05-10 09:37:54Z mw $"); #endif -__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.2 2018/05/19 09:32:55 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.3 2018/06/01 09:34:39 maxv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1441,7 +1441,7 @@ ena_rx_mbuf(struct ena_ring *rx_ring, st rx_info, rx_info->mbuf, (uintmax_t)rx_info->ena_buf.paddr); mbuf = rx_info->mbuf; - mbuf->m_flags |= M_PKTHDR; + KASSERT(mbuf->m_flags & M_PKTHDR); mbuf->m_pkthdr.len = len; mbuf->m_len = len; mbuf->m_pkthdr.rcvif = rx_ring->que->adapter->ifp;