svn commit: r183726 - in stable/7/sys: . kern
John Baldwin
jhb at FreeBSD.org
Thu Oct 9 17:52:48 UTC 2008
Author: jhb
Date: Thu Oct 9 17:52:47 2008
New Revision: 183726
URL: http://svn.freebsd.org/changeset/base/183726
Log:
MFC: Wait until after dropping the receive socket buffer lock to allocate
space to store the socket address stored in the first mbuf in a packet
chain in soreceive_dgram().
Approved by: re (kensmith)
Modified:
stable/7/sys/ (props changed)
stable/7/sys/kern/uipc_socket.c
Modified: stable/7/sys/kern/uipc_socket.c
==============================================================================
--- stable/7/sys/kern/uipc_socket.c Thu Oct 9 14:55:45 2008 (r183725)
+++ stable/7/sys/kern/uipc_socket.c Thu Oct 9 17:52:47 2008 (r183726)
@@ -1928,34 +1928,11 @@ soreceive_dgram(struct socket *so, struc
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_dgram: post-control, nextrecord !sync"));
if (nextrecord == NULL) {
- KASSERT(so->so_rcv.sb_mb == m,
- ("soreceive_dgram: post-control, sb_mb!=m"));
KASSERT(so->so_rcv.sb_lastrecord == m,
("soreceive_dgram: lastrecord != m"));
}
- 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"));
@@ -1978,6 +1955,19 @@ soreceive_dgram(struct socket *so, struc
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.
More information about the svn-src-stable-7
mailing list