From 75cc373f3649bee9a6659bc653ec4b585e7728db Mon Sep 17 00:00:00 2001 From: Keith Sklower Date: Wed, 20 Feb 1991 01:41:20 -0800 Subject: [PATCH] fix sbappend to check the last mbuf in a chain for M_EORness; fix sbcompress not to compress out zero length mbufs if the type is different. SCCS-vsn: sys/kern/uipc_socket2.c 7.16 --- usr/src/sys/kern/uipc_socket2.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/usr/src/sys/kern/uipc_socket2.c b/usr/src/sys/kern/uipc_socket2.c index 0054390902..dc8dbf3d4c 100644 --- a/usr/src/sys/kern/uipc_socket2.c +++ b/usr/src/sys/kern/uipc_socket2.c @@ -4,7 +4,7 @@ * * %sccs.include.redist.c% * - * @(#)uipc_socket2.c 7.15 (Berkeley) %G% + * @(#)uipc_socket2.c 7.16 (Berkeley) %G% */ #include "param.h" @@ -438,12 +438,12 @@ sbappend(sb, m) if (n = sb->sb_mb) { while (n->m_nextpkt) n = n->m_nextpkt; - while (n->m_next) + do { if (n->m_flags & M_EOR) { sbappendrecord(sb, m); /* XXXXXX!!!! */ return; - } else - n = n->m_next; + } + } while (n->m_next && (n = n->m_next)); } sbcompress(sb, m, n); } @@ -636,10 +636,14 @@ sbcompress(sb, m, n) register struct mbuf *m, *n; { register int eor = 0; + register struct mbuf *o; while (m) { eor |= m->m_flags & M_EOR; - if (m->m_len == 0) { + if (m->m_len == 0 && + (eor == 0 || + (((o = m->m_next) || (o = n)) && + o->m_type == m->m_type))) { m = m_free(m); continue; } @@ -663,8 +667,12 @@ sbcompress(sb, m, n) m = m->m_next; n->m_next = 0; } - if (n) - n->m_flags |= eor; + if (eor) { + if (n) + n->m_flags |= eor; + else + printf("semi-panic: sbcompress\n"); + } } /* -- 2.20.1