diff options
| author | David Malone <dwmalone@FreeBSD.org> | 2001-10-04 13:11:48 +0000 |
|---|---|---|
| committer | David Malone <dwmalone@FreeBSD.org> | 2001-10-04 13:11:48 +0000 |
| commit | 2bc21ed9856748bd3510da944f11597975ef8d81 (patch) | |
| tree | 6615cc44c88feefec804ce8ebb7cd6284b4483b6 /sys/kern/uipc_socket.c | |
| parent | 15821eba77adf38fd4adebfb7a7b842ba54ab861 (diff) | |
Notes
Diffstat (limited to 'sys/kern/uipc_socket.c')
| -rw-r--r-- | sys/kern/uipc_socket.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index a54dcff20861..0b4052269aca 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -672,7 +672,7 @@ soreceive(so, psa, uio, mp0, controlp, flagsp) struct mbuf **controlp; int *flagsp; { - register struct mbuf *m, **mp; + struct mbuf *m, **mp; register int flags, len, error, s, offset; struct protosw *pr = so->so_proto; struct mbuf *nextrecord; @@ -798,23 +798,22 @@ dontblock: m = m->m_next; } else { sbfree(&so->so_rcv, m); - if (controlp) { - if (pr->pr_domain->dom_externalize && - mtod(m, struct cmsghdr *)->cmsg_type == - SCM_RIGHTS) - error = (*pr->pr_domain->dom_externalize)(m); + so->so_rcv.sb_mb = m->m_next; + m->m_next = NULL; + if (pr->pr_domain->dom_externalize) + error = + (*pr->pr_domain->dom_externalize)(m, controlp); + else if (controlp) *controlp = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; - } else { - MFREE(m, so->so_rcv.sb_mb); - m = so->so_rcv.sb_mb; - } + else + m_freem(m); + m = so->so_rcv.sb_mb; } if (controlp) { orig_resid = 0; - controlp = &(*controlp)->m_next; + do + controlp = &(*controlp)->m_next; + while (*controlp != NULL); } } if (m) { |
