diff options
author | rwatson <rwatson@FreeBSD.org> | 2005-03-12 13:39:39 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2005-03-12 13:39:39 +0000 |
commit | 9237eab76900b1a75717b754144177e816980984 (patch) | |
tree | efbe06217cab514e92c827d5889a45fb10d4baf1 /sys/kern/uipc_sockbuf.c | |
parent | 06992e84320db41205bd6cd5c108cf163cf280cd (diff) | |
download | FreeBSD-src-9237eab76900b1a75717b754144177e816980984.zip FreeBSD-src-9237eab76900b1a75717b754144177e816980984.tar.gz |
Extend the coverage of the accept and socket mutexes in soisconnected()
so that the socket lock is held over the test-and-set removal of the
accept filter option during connect, and the two socket mutex regions
(transition to connected, perform accept filter) are combined.
Diffstat (limited to 'sys/kern/uipc_sockbuf.c')
-rw-r--r-- | sys/kern/uipc_sockbuf.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c index 17a09ca..0db83df 100644 --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -117,14 +117,14 @@ soisconnected(so) { struct socket *head; + ACCEPT_LOCK(); SOCK_LOCK(so); so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); so->so_state |= SS_ISCONNECTED; - SOCK_UNLOCK(so); - ACCEPT_LOCK(); head = so->so_head; if (head != NULL && (so->so_qstate & SQ_INCOMP)) { if ((so->so_options & SO_ACCEPTFILTER) == 0) { + SOCK_UNLOCK(so); TAILQ_REMOVE(&head->so_incomp, so, so_list); head->so_incqlen--; so->so_qstate &= ~SQ_INCOMP; @@ -136,7 +136,6 @@ soisconnected(so) wakeup_one(&head->so_timeo); } else { ACCEPT_UNLOCK(); - SOCK_LOCK(so); so->so_upcall = head->so_accf->so_accept_filter->accf_callback; so->so_upcallarg = head->so_accf->so_accept_filter_arg; @@ -147,6 +146,7 @@ soisconnected(so) } return; } + SOCK_UNLOCK(so); ACCEPT_UNLOCK(); wakeup(&so->so_timeo); sorwakeup(so); |