From: Vitaliy Makkoveev Subject: Use WRITE_ONCE() to se set so_error in sosend()/soreceive() To: Alexander Bluhm , tech@openbsd.org Date: Mon, 6 Jan 2025 18:58:16 +0300 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");