Index: uipc_socket.c =================================================================== RCS file: /home/ncvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.212 diff -u -r1.212 uipc_socket.c --- uipc_socket.c 5 Sep 2004 14:33:21 -0000 1.212 +++ uipc_socket.c 10 Oct 2004 17:03:35 -0000 @@ -322,16 +322,19 @@ { struct socket *head; - KASSERT(so->so_count == 0, ("socket %p so_count not 0", so)); SOCK_LOCK_ASSERT(so); + KASSERT(so->so_count == 0, ("socket %p so_count not 0", so)); + SOCK_UNLOCK(so); + + ACCEPT_LOCK(); + SOCK_LOCK(so); if (so->so_pcb != NULL || (so->so_state & SS_NOFDREF) == 0) { SOCK_UNLOCK(so); + ACCEPT_UNLOCK(); return; } - SOCK_UNLOCK(so); - ACCEPT_LOCK(); head = so->so_head; if (head != NULL) { KASSERT((so->so_qstate & SQ_COMP) != 0 || @@ -353,6 +356,7 @@ * the listening socket is closed. */ if ((so->so_qstate & SQ_COMP) != 0) { + SOCK_UNLOCK(so); ACCEPT_UNLOCK(); return; } @@ -365,6 +369,7 @@ (so->so_qstate & SQ_INCOMP) == 0, ("sofree: so_head == NULL, but still SQ_COMP(%d) or SQ_INCOMP(%d)", so->so_qstate & SQ_COMP, so->so_qstate & SQ_INCOMP)); + SOCK_UNLOCK(so); ACCEPT_UNLOCK(); SOCKBUF_LOCK(&so->so_snd); so->so_snd.sb_flags |= SB_NOINTR;