aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2021-06-14 21:32:27 +0000
committerMark Johnston <markj@FreeBSD.org>2021-06-21 13:14:40 +0000
commit46d8116cae6845be70230640f16568576269b177 (patch)
tree6ac9452745f90f3ad290c6bba42ada658ca97768
parent4a77ce73eadfe7ceddc3f2330028880b886401fd (diff)
downloadsrc-46d8116cae6845be70230640f16568576269b177.tar.gz
src-46d8116cae6845be70230640f16568576269b177.zip
Consistently use the SOLISTENING() macro
Some code was using it already, but in many places we were testing SO_ACCEPTCONN directly. As a small step towards fixing some bugs involving synchronization with listen(2), make the kernel consistently use SOLISTENING(). No functional change intended. Sponsored by: The FreeBSD Foundation (cherry picked from commit f4bb1869ddd2bca89b6b6bfaf4d866efdd9243cf)
-rw-r--r--sys/dev/hyperv/hvsock/hv_sock.c2
-rw-r--r--sys/kern/uipc_accf.c7
-rw-r--r--sys/kern/uipc_socket.c8
-rw-r--r--sys/kern/uipc_syscalls.c2
-rw-r--r--sys/kern/uipc_usrreq.c2
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c3
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c3
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_sco.c2
-rw-r--r--sys/netinet/tcp_input.c7
-rw-r--r--sys/netinet/tcp_subr.c4
-rw-r--r--sys/rpc/svc_vc.c2
11 files changed, 19 insertions, 23 deletions
diff --git a/sys/dev/hyperv/hvsock/hv_sock.c b/sys/dev/hyperv/hvsock/hv_sock.c
index bcc237271465..00e296fcd335 100644
--- a/sys/dev/hyperv/hvsock/hv_sock.c
+++ b/sys/dev/hyperv/hvsock/hv_sock.c
@@ -1482,7 +1482,7 @@ hvsock_open_conn_passive(struct vmbus_channel *chan, struct socket *so,
int error;
/* Do nothing if socket is not listening */
- if ((so->so_options & SO_ACCEPTCONN) == 0) {
+ if (!SOLISTENING(so)) {
HVSOCK_DBG(HVSOCK_DBG_ERR,
"%s: socket is not a listening one\n", __func__);
return;
diff --git a/sys/kern/uipc_accf.c b/sys/kern/uipc_accf.c
index 3ca64dd21e25..792c53c7baff 100644
--- a/sys/kern/uipc_accf.c
+++ b/sys/kern/uipc_accf.c
@@ -172,7 +172,7 @@ accept_filt_getopt(struct socket *so, struct sockopt *sopt)
error = 0;
afap = malloc(sizeof(*afap), M_TEMP, M_WAITOK | M_ZERO);
SOCK_LOCK(so);
- if ((so->so_options & SO_ACCEPTCONN) == 0) {
+ if (!SOLISTENING(so)) {
error = EINVAL;
goto out;
}
@@ -208,7 +208,7 @@ accept_filt_setopt(struct socket *so, struct sockopt *sopt)
int wakeup;
SOCK_LOCK(so);
- if ((so->so_options & SO_ACCEPTCONN) == 0) {
+ if (!SOLISTENING(so)) {
SOCK_UNLOCK(so);
return (EINVAL);
}
@@ -278,8 +278,7 @@ accept_filt_setopt(struct socket *so, struct sockopt *sopt)
* without first removing it.
*/
SOCK_LOCK(so);
- if ((so->so_options & SO_ACCEPTCONN) == 0 ||
- so->sol_accept_filter != NULL) {
+ if (!SOLISTENING(so) || so->sol_accept_filter != NULL) {
error = EINVAL;
goto out;
}
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 852132e45e58..070ed440b500 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1176,7 +1176,6 @@ int
soclose(struct socket *so)
{
struct accept_queue lqueue;
- bool listening;
int error = 0;
KASSERT(!(so->so_state & SS_NOFDREF), ("soclose: SS_NOFDREF on enter"));
@@ -1212,7 +1211,7 @@ drop:
(*so->so_proto->pr_usrreqs->pru_close)(so);
SOCK_LOCK(so);
- if ((listening = (so->so_options & SO_ACCEPTCONN))) {
+ if (SOLISTENING(so)) {
struct socket *sp;
TAILQ_INIT(&lqueue);
@@ -1233,7 +1232,7 @@ drop:
KASSERT((so->so_state & SS_NOFDREF) == 0, ("soclose: NOFDREF"));
so->so_state |= SS_NOFDREF;
sorele(so);
- if (listening) {
+ if (SOLISTENING(so)) {
struct socket *sp, *tsp;
TAILQ_FOREACH_SAFE(sp, &lqueue, so_list, tsp) {
@@ -1313,7 +1312,8 @@ soconnectat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td)
{
int error;
- if (so->so_options & SO_ACCEPTCONN)
+ /* XXXMJ racy */
+ if (SOLISTENING(so))
return (EOPNOTSUPP);
CURVNET_SET(so->so_vnet);
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 23fae343924a..18505b54d603 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -338,7 +338,7 @@ kern_accept4(struct thread *td, int s, struct sockaddr **name,
if (error != 0)
return (error);
head = headfp->f_data;
- if ((head->so_options & SO_ACCEPTCONN) == 0) {
+ if (!SOLISTENING(head)) {
error = EINVAL;
goto done;
}
diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c
index 4466ae8822cd..a01171424320 100644
--- a/sys/kern/uipc_usrreq.c
+++ b/sys/kern/uipc_usrreq.c
@@ -1602,7 +1602,7 @@ unp_connectat(int fd, struct socket *so, struct sockaddr *nam,
goto bad2;
}
if (connreq) {
- if (so2->so_options & SO_ACCEPTCONN) {
+ if (SOLISTENING(so2)) {
CURVNET_SET(so2->so_vnet);
so2 = sonewconn(so2, 0);
CURVNET_RESTORE();
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
index 2bd15ac35895..cd620fe3aef9 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
@@ -2733,8 +2733,7 @@ ng_btsocket_l2cap_pcb_by_addr(bdaddr_p bdaddr, int psm)
mtx_assert(&ng_btsocket_l2cap_sockets_mtx, MA_OWNED);
LIST_FOREACH(p, &ng_btsocket_l2cap_sockets, next) {
- if (p->so == NULL || !(p->so->so_options & SO_ACCEPTCONN) ||
- p->psm != psm)
+ if (p->so == NULL || !SOLISTENING(p->so) || p->psm != psm)
continue;
if (bcmp(&p->src, bdaddr, sizeof(p->src)) == 0)
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
index 95b28e6cc5e7..c0704bce55fa 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
@@ -3398,8 +3398,7 @@ ng_btsocket_rfcomm_pcb_listener(bdaddr_p src, int channel)
mtx_lock(&ng_btsocket_rfcomm_sockets_mtx);
LIST_FOREACH(pcb, &ng_btsocket_rfcomm_sockets, next) {
- if (pcb->channel != channel ||
- !(pcb->so->so_options & SO_ACCEPTCONN))
+ if (pcb->channel != channel || !SOLISTENING(pcb->so))
continue;
if (bcmp(&pcb->src, src, sizeof(*src)) == 0)
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c b/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c
index da8f22befc79..068b1890f27f 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c
@@ -1829,7 +1829,7 @@ ng_btsocket_sco_pcb_by_addr(bdaddr_p bdaddr)
LIST_FOREACH(p, &ng_btsocket_sco_sockets, next) {
mtx_lock(&p->pcb_mtx);
- if (p->so == NULL || !(p->so->so_options & SO_ACCEPTCONN)) {
+ if (p->so == NULL || !SOLISTENING(p->so)) {
mtx_unlock(&p->pcb_mtx);
continue;
}
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 19232218170b..6d86e43f07dd 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -950,8 +950,7 @@ findpcb:
}
if ((inp->inp_flowtype == M_HASHTYPE_NONE) &&
(M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) &&
- ((inp->inp_socket == NULL) ||
- (inp->inp_socket->so_options & SO_ACCEPTCONN) == 0)) {
+ ((inp->inp_socket == NULL) || !SOLISTENING(inp->inp_socket))) {
inp->inp_flowid = m->m_pkthdr.flowid;
inp->inp_flowtype = M_HASHTYPE_GET(m);
}
@@ -1061,9 +1060,9 @@ findpcb:
* state) we look into the SYN cache if this is a new connection
* attempt or the completion of a previous one.
*/
- KASSERT(tp->t_state == TCPS_LISTEN || !(so->so_options & SO_ACCEPTCONN),
+ KASSERT(tp->t_state == TCPS_LISTEN || !SOLISTENING(so),
("%s: so accepting but tp %p not listening", __func__, tp));
- if (tp->t_state == TCPS_LISTEN && (so->so_options & SO_ACCEPTCONN)) {
+ if (tp->t_state == TCPS_LISTEN && SOLISTENING(so)) {
struct in_conninfo inc;
bzero(&inc, sizeof(inc));
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index ec162d889902..32a814ac2c4e 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -3666,8 +3666,8 @@ sysctl_drop(SYSCTL_HANDLER_ARGS)
tcp_twclose(tw, 0);
else
INP_WUNLOCK(inp);
- } else if (!(inp->inp_flags & INP_DROPPED) &&
- !(inp->inp_socket->so_options & SO_ACCEPTCONN)) {
+ } else if ((inp->inp_flags & INP_DROPPED) == 0 &&
+ !SOLISTENING(inp->inp_socket)) {
tp = intotcpcb(inp);
tp = tcp_drop(tp, ECONNABORTED);
if (tp != NULL)
diff --git a/sys/rpc/svc_vc.c b/sys/rpc/svc_vc.c
index 6cff3434364d..67951108b01c 100644
--- a/sys/rpc/svc_vc.c
+++ b/sys/rpc/svc_vc.c
@@ -329,7 +329,7 @@ svc_vc_accept(struct socket *head, struct socket **sop)
short nbio;
/* XXXGL: shouldn't that be an assertion? */
- if ((head->so_options & SO_ACCEPTCONN) == 0) {
+ if (!SOLISTENING(head)) {
error = EINVAL;
goto done;
}