summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_sockbuf.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2005-03-12 13:39:39 +0000
committerrwatson <rwatson@FreeBSD.org>2005-03-12 13:39:39 +0000
commit9237eab76900b1a75717b754144177e816980984 (patch)
treeefbe06217cab514e92c827d5889a45fb10d4baf1 /sys/kern/uipc_sockbuf.c
parent06992e84320db41205bd6cd5c108cf163cf280cd (diff)
downloadFreeBSD-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.c6
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);
OpenPOWER on IntegriCloud