summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2014-10-11 22:08:53 +0000
committeradrian <adrian@FreeBSD.org>2014-10-11 22:08:53 +0000
commit8128ee7851b62e1d1a975b817b3a86e66c5331ca (patch)
tree2fe32b642b55a548b977e50223d37ed6d1b8f00f
parentf2976cb6becb88d85dc28223983f7ba402afc426 (diff)
downloadFreeBSD-src-8128ee7851b62e1d1a975b817b3a86e66c5331ca.zip
FreeBSD-src-8128ee7851b62e1d1a975b817b3a86e66c5331ca.tar.gz
Merge r271647 - Fix a double-free of mbufs in rx_ixgbe_discard().
fmp->buf at the free point is already part of the chain being freed, so double-freeing is counter-productive. Submitted by: Marc De La Gueronniere <mdelagueronniere@verisign.com> Sponsored by: Verisign, Inc.
-rw-r--r--sys/dev/ixgbe/ixgbe.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c
index 1e9b980..c2f258a 100644
--- a/sys/dev/ixgbe/ixgbe.c
+++ b/sys/dev/ixgbe/ixgbe.c
@@ -4368,11 +4368,6 @@ ixgbe_rx_discard(struct rx_ring *rxr, int i)
rbuf = &rxr->rx_buffers[i];
- if (rbuf->fmp != NULL) {/* Partial chain ? */
- rbuf->fmp->m_flags |= M_PKTHDR;
- m_freem(rbuf->fmp);
- rbuf->fmp = NULL;
- }
/*
** With advanced descriptors the writeback
@@ -4381,7 +4376,13 @@ ixgbe_rx_discard(struct rx_ring *rxr, int i)
** the normal refresh path to get new buffers
** and mapping.
*/
- if (rbuf->buf) {
+
+ if (rbuf->fmp != NULL) {/* Partial chain ? */
+ rbuf->fmp->m_flags |= M_PKTHDR;
+ m_freem(rbuf->fmp);
+ rbuf->fmp = NULL;
+ rbuf->buf = NULL; /* rbuf->buf is part of fmp's chain */
+ } else if (rbuf->buf) {
m_free(rbuf->buf);
rbuf->buf = NULL;
}
OpenPOWER on IntegriCloud