Download raw body.
Use WRITE_ONCE() to se set so_error in sosend()/soreceive()
This is the lockless access, so do it.
Index: sys/kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
diff -u -p -r1.356 uipc_socket.c
--- sys/kern/uipc_socket.c 4 Jan 2025 15:57:02 -0000 1.356
+++ sys/kern/uipc_socket.c 6 Jan 2025 15:53:54 -0000
@@ -640,7 +640,7 @@ restart:
if (so->so_snd.sb_state & SS_CANTSENDMORE)
snderr(EPIPE);
if ((error = READ_ONCE(so->so_error))) {
- so->so_error = 0;
+ WRITE_ONCE(so->so_error, 0);
snderr(error);
}
if ((so->so_state & SS_ISCONNECTED) == 0) {
@@ -934,7 +934,7 @@ restart:
goto dontblock;
error = error2;
if ((flags & MSG_PEEK) == 0)
- so->so_error = 0;
+ WRITE_ONCE(so->so_error, 0);
goto release;
}
if (so->so_rcv.sb_state & SS_CANTRCVMORE) {
@@ -1204,7 +1204,7 @@ dontblock:
while (flags & MSG_WAITALL && m == NULL && uio->uio_resid > 0 &&
!sosendallatonce(so) && !nextrecord) {
if (so->so_rcv.sb_state & SS_CANTRCVMORE ||
- so->so_error)
+ READ_ONCE(so->so_error))
break;
SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
Use WRITE_ONCE() to se set so_error in sosend()/soreceive()