summaryrefslogtreecommitdiff
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorDavid Malone <dwmalone@FreeBSD.org>2001-10-04 13:11:48 +0000
committerDavid Malone <dwmalone@FreeBSD.org>2001-10-04 13:11:48 +0000
commit2bc21ed9856748bd3510da944f11597975ef8d81 (patch)
tree6615cc44c88feefec804ce8ebb7cd6284b4483b6 /sys/kern/uipc_socket.c
parent15821eba77adf38fd4adebfb7a7b842ba54ab861 (diff)
Notes
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c27
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) {