git: d48fcf99c450 - stable/14 - tcp: improve inp locking in setsockopt

From: Michael Tuexen <tuexen_at_FreeBSD.org>
Date: Sat, 03 Aug 2024 22:33:21 UTC
The branch stable/14 has been updated by tuexen:

URL: https://cgit.FreeBSD.org/src/commit/?id=d48fcf99c4504b52f8ade5f7d47bfe67920f6e35

commit d48fcf99c4504b52f8ade5f7d47bfe67920f6e35
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2024-05-23 20:14:27 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2024-08-03 22:32:45 +0000

    tcp: improve inp locking in setsockopt
    
    Ensure that the inp is not dropped when starting a stack switch.
    While there, clean-up the code by using INP_WLOCK_RECHECK, which
    also re-assigns tp.
    
    Reviewed by:            glebius
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D45241
    
    (cherry picked from commit fe136aecc2a0ae9d9cc5f78b2d1430cd33b6b7c4)
---
 sys/netinet/tcp_usrreq.c | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index f65b09f17a5f..a76a185474df 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -1696,11 +1696,7 @@ tcp_ctloutput_set(struct inpcb *inp, struct sockopt *sopt)
 		default:
 			return (error);
 		}
-		INP_WLOCK(inp);
-		if (inp->inp_flags & INP_DROPPED) {
-			INP_WUNLOCK(inp);
-			return (ECONNRESET);
-		}
+		INP_WLOCK_RECHECK(inp);
 	} else if (sopt->sopt_name == TCP_FUNCTION_BLK) {
 		/*
 		 * Protect the TCP option TCP_FUNCTION_BLK so
@@ -1715,8 +1711,7 @@ tcp_ctloutput_set(struct inpcb *inp, struct sockopt *sopt)
 		if (error)
 			return (error);
 
-		INP_WLOCK(inp);
-		tp = intotcpcb(inp);
+		INP_WLOCK_RECHECK(inp);
 
 		blk = find_and_ref_tcp_functions(&fsn);
 		if (blk == NULL) {