diff options
author | glebius <glebius@FreeBSD.org> | 2013-03-29 14:10:40 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2013-03-29 14:10:40 +0000 |
commit | 11f04943deb92796487dfa8416b1cfa769981f54 (patch) | |
tree | feab6fa7d56369b322a8818b5e81fbfa415cd44d | |
parent | 06ecb1b7cada59fcf9ba274b517b978ac404fa1e (diff) | |
download | FreeBSD-src-11f04943deb92796487dfa8416b1cfa769981f54.zip FreeBSD-src-11f04943deb92796487dfa8416b1cfa769981f54.tar.gz |
Fix bug in m_split() in a case when split len matches len of the
first mbuf, and the first mbuf is M_PKTHDR.
PR: kern/176144
Submitted by: Jacques Fourie <jacques.fourie gmail.com>
-rw-r--r-- | sys/kern/uipc_mbuf.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index ea4fd80..c369797 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -1197,7 +1197,16 @@ m_split(struct mbuf *m0, int len0, int wait) if (m == NULL) return (NULL); remain = m->m_len - len; - if (m0->m_flags & M_PKTHDR) { + if (m0->m_flags & M_PKTHDR && remain == 0) { + n = m_gethdr(wait, m0->m_type); + return (NULL); + n->m_next = m->m_next; + m->m_next = NULL; + n->m_pkthdr.rcvif = m0->m_pkthdr.rcvif; + n->m_pkthdr.len = m0->m_pkthdr.len - len0; + m0->m_pkthdr.len = len0; + return (n); + } else if (m0->m_flags & M_PKTHDR) { n = m_gethdr(wait, m0->m_type); if (n == NULL) return (NULL); |