From 45ae4194cfa278c1ec75c7bf097027ff73912310 Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Fri, 17 Mar 2006 04:21:58 +0000 Subject: rev 1.77 m_cat() - if it is safe, copy data portion into 1st mbuf even if 1st mbuf is M_EXT mbuf. rev 1.72 clarify comment on m_cat(). From itojun NetBSD ok claudio@ mcbride@ --- sys/kern/uipc_mbuf.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index de19ca5cf4a..35a1f693213 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_mbuf.c,v 1.73 2006/03/05 00:44:25 brad Exp $ */ +/* $OpenBSD: uipc_mbuf.c,v 1.74 2006/03/17 04:21:57 brad Exp $ */ /* $NetBSD: uipc_mbuf.c,v 1.15.4.1 1996/06/13 17:11:44 cgd Exp $ */ /* @@ -433,7 +433,9 @@ out: if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen)) /* * Concatenate mbuf chain n to m. - * Both chains must be of the same type (e.g. MT_DATA). + * n might be copied into m (when n->m_len is small), therefore data portion of + * n could be copied into an mbuf of different mbuf type. + * Therefore both chains should be of the same type (e.g. MT_DATA). * Any m_pkthdr is not updated. */ void @@ -442,8 +444,7 @@ m_cat(struct mbuf *m, struct mbuf *n) while (m->m_next) m = m->m_next; while (n) { - if (m->m_flags & M_EXT || - m->m_data + m->m_len + n->m_len >= &m->m_dat[MLEN]) { + if (M_READONLY(m) || n->m_len > M_TRAILINGSPACE(m)) { /* just join the two chains */ m->m_next = n; return; -- cgit v1.2.3