--- //depot/user/jhb/lock/kern/uipc_socket.c +++ /home/jhb/work/p4/lock/kern/uipc_socket.c @@ -1959,39 +1959,15 @@ SOCKBUF_LOCK_ASSERT(&so->so_rcv); if (uio->uio_td) uio->uio_td->td_ru.ru_msgrcv++; - KASSERT(m == so->so_rcv.sb_mb, ("soreceive: m != so->so_rcv.sb_mb")); + KASSERT(m == so->so_rcv.sb_mb, ("soreceive_dgram: m != sb_mb")); SBLASTRECORDCHK(&so->so_rcv); SBLASTMBUFCHK(&so->so_rcv); nextrecord = m->m_nextpkt; - if (pr->pr_flags & PR_ADDR) { - KASSERT(m->m_type == MT_SONAME, - ("m->m_type == %d", m->m_type)); - if (psa != NULL) - *psa = sodupsockaddr(mtod(m, struct sockaddr *), - M_NOWAIT); - sbfree(&so->so_rcv, m); - so->so_rcv.sb_mb = m_free(m); - m = so->so_rcv.sb_mb; - sockbuf_pushsync(&so->so_rcv, nextrecord); - } - if (m == NULL) { - /* XXXRW: Can this happen? */ - SOCKBUF_UNLOCK(&so->so_rcv); - return (0); - } - KASSERT(m->m_nextpkt == nextrecord, - ("soreceive: post-control, nextrecord !sync")); if (nextrecord == NULL) { - KASSERT(so->so_rcv.sb_mb == m, - ("soreceive: post-control, sb_mb!=m")); KASSERT(so->so_rcv.sb_lastrecord == m, - ("soreceive: post-control, lastrecord!=m")); + ("soreceive_dgram: lastrecord != m")); } - SOCKBUF_LOCK_ASSERT(&so->so_rcv); - SBLASTRECORDCHK(&so->so_rcv); - SBLASTMBUFCHK(&so->so_rcv); - KASSERT(m == so->so_rcv.sb_mb, ("soreceive_dgram: m not sb_mb")); KASSERT(so->so_rcv.sb_mb->m_nextpkt == nextrecord, ("soreceive_dgram: m_nextpkt != nextrecord")); @@ -2014,6 +1990,19 @@ SBLASTMBUFCHK(&so->so_rcv); SOCKBUF_UNLOCK(&so->so_rcv); + if (pr->pr_flags & PR_ADDR) { + KASSERT(m->m_type == MT_SONAME, + ("m->m_type == %d", m->m_type)); + if (psa != NULL) + *psa = sodupsockaddr(mtod(m, struct sockaddr *), + M_NOWAIT); + m = m_free(m); + } + if (m == NULL) { + /* XXXRW: Can this happen? */ + return (0); + } + /* * Packet to copyout() is now in 'm' and it is disconnected from the * queue.