diff options
| author | Gleb Smirnoff <glebius@FreeBSD.org> | 2025-01-28 05:02:22 +0000 |
|---|---|---|
| committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2025-01-28 05:02:22 +0000 |
| commit | 06bf119f265c38c0ed16a1461fdc43356c3edf7a (patch) | |
| tree | 42fa09ef27909e94c2181236df27b34c9a37d78f | |
| parent | aa90fbed151de512ab6e59f75df009533a15751f (diff) | |
| -rw-r--r-- | sys/netinet/tcp_usrreq.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 3e73e448a9f7..c6713a0bb4cb 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -355,9 +355,10 @@ out: static int tcp_usr_listen(struct socket *so, int backlog, struct thread *td) { - int error = 0; struct inpcb *inp; struct tcpcb *tp; + int error = 0; + bool already_listening; inp = sotoinpcb(so); KASSERT(inp != NULL, ("tcp_usr_listen: inp == NULL")); @@ -369,6 +370,7 @@ tcp_usr_listen(struct socket *so, int backlog, struct thread *td) tp = intotcpcb(inp); SOCK_LOCK(so); + already_listening = SOLISTENING(so); error = solisten_proto_check(so); if (error != 0) { SOCK_UNLOCK(so); @@ -390,6 +392,8 @@ tcp_usr_listen(struct socket *so, int backlog, struct thread *td) solisten_proto_abort(so); } SOCK_UNLOCK(so); + if (already_listening) + goto out; if (error == 0) in_pcblisten(inp); @@ -408,10 +412,11 @@ out: static int tcp6_usr_listen(struct socket *so, int backlog, struct thread *td) { - int error = 0; struct inpcb *inp; struct tcpcb *tp; u_char vflagsav; + int error = 0; + bool already_listening; inp = sotoinpcb(so); KASSERT(inp != NULL, ("tcp6_usr_listen: inp == NULL")); @@ -425,6 +430,7 @@ tcp6_usr_listen(struct socket *so, int backlog, struct thread *td) vflagsav = inp->inp_vflag; SOCK_LOCK(so); + already_listening = SOLISTENING(so); error = solisten_proto_check(so); if (error != 0) { SOCK_UNLOCK(so); @@ -449,6 +455,8 @@ tcp6_usr_listen(struct socket *so, int backlog, struct thread *td) solisten_proto_abort(so); } SOCK_UNLOCK(so); + if (already_listening) + goto out; if (error == 0) in_pcblisten(inp); |
