Do `so_rcv' cleanup with sblock() held.
authormvs <mvs@openbsd.org>
Thu, 13 May 2021 19:43:11 +0000 (19:43 +0000)
committermvs <mvs@openbsd.org>
Thu, 13 May 2021 19:43:11 +0000 (19:43 +0000)
commitc3ed56ccf745fb861274d4b4ccdeca2d0a369291
treeefd9aa7481edc1bbbbf05523452d63a1f097f68b
parent285e3455f19744964261b71b66d9c75f75d20405
Do `so_rcv' cleanup with sblock() held.

solock() should be taken before sblock(). soreceive() grabs solock() and
then locks `so_rcv'. But later it releases solock() before call uimove(9).
So concurrent thread which performs soshutdown() could break sorecive()
loop. But `so_rcv' is still locked by sblock() so this soshutdown()
thread will sleep in sorflush() at sblock() call. soshutdown() thread
doesn't release solock() after sblock() call so it has no matter where to
release `so_rcv' - is will be locked until the solock() release.

That's why this strange looking code works fine. This sbunlock() movement
just after `so_rcv' cleanup  affects nothing but makes the code
consistent and clean to understand.

ok mpi@
sys/kern/uipc_socket.c