diff --git a/sys/netinet/igmp.c b/sys/netinet/igmp.c index 00288356cb1..226f38a035f 100644 --- a/sys/netinet/igmp.c +++ b/sys/netinet/igmp.c @@ -3326,10 +3326,12 @@ igmp_v3_merge_state_changes(struct in_multi *inm, struct mbufq *scq) CTR2(KTR_IGMPV3, "%s: outbound queue full, skipping whole packet %p", __func__, m); - mt = m->m_nextpkt; - if (!docopy) + m0 = m->m_nextpkt; + if (!docopy) { + mbufq_remove(gq, m); m_freem(m); - m = mt; + } + m = m0; continue; } diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h index c5072cec904..fb1a0a5b81d 100644 --- a/sys/sys/mbuf.h +++ b/sys/sys/mbuf.h @@ -1656,6 +1656,14 @@ mbufq_enqueue(struct mbufq *mq, struct mbuf *m) return (0); } +static inline void +mbufq_remove(struct mbufq *mq, struct mbuf *m) +{ + + STAILQ_REMOVE(&mq->mq_head, m, mbuf, m_stailqpkt); + mq->mq_len--; +} + static inline struct mbuf * mbufq_dequeue(struct mbufq *mq) {