git: 862d2d514cb7 - stable/13 - sockets: re-check socket state after call to pr_rcvd()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 27 Sep 2023 12:52:25 UTC
The branch stable/13 has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=862d2d514cb782353bce1af99d670db08b1e6c3c
commit 862d2d514cb782353bce1af99d670db08b1e6c3c
Author: Greg Becker <becker.greg@att.net>
AuthorDate: 2023-09-09 23:38:24 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2023-09-27 12:33:08 +0000
sockets: re-check socket state after call to pr_rcvd()
Socket state may have changed after dropping the receive
buffer lock in order to call pr_rcvd(). If the buffer is
empty, re-check the state after reaquiring the lock and
skip calling sbwait() if the socket is in error or the
peer has closed.
PR: 212716
Reviewed by: markj, glebius
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D41783
(cherry picked from commit f44102411e1b16363e91a074c9c403069c550e4d)
---
sys/kern/uipc_socket.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index a4623329e686..e5997e439964 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -2326,6 +2326,10 @@ dontblock:
VNET_SO_ASSERT(so);
(*pr->pr_usrreqs->pru_rcvd)(so, flags);
SOCKBUF_LOCK(&so->so_rcv);
+ if (__predict_false(so->so_rcv.sb_mb == NULL &&
+ (so->so_error || so->so_rerror ||
+ so->so_rcv.sb_state & SBS_CANTRCVMORE)))
+ break;
}
SBLASTRECORDCHK(&so->so_rcv);
SBLASTMBUFCHK(&so->so_rcv);