Fix race between rip_input() and soisdisconnected().
authorbluhm <bluhm@openbsd.org>
Fri, 12 Apr 2024 12:25:58 +0000 (12:25 +0000)
committerbluhm <bluhm@openbsd.org>
Fri, 12 Apr 2024 12:25:58 +0000 (12:25 +0000)
commit2b41c8d614e7bfdd694bcaf4263583750f13a8ea
tree6b0b4fe28c6f4e0e43537be988c660f9c96daa9d
parent222e275fb89ffb67abe0726dee2b107220092dc3
Fix race between rip_input() and soisdisconnected().

Setting SS_CANTRCVMORE is protected by mutex of receive socket
buffer.  The raw inpcb loop in rip_input() does a lockless access.
Protect it with READ_ONCE(), although it is not perfect.  Check the
socket buffer state again when the mutex is held.  Drop and count
the packet that is processed between the checks.

Currently soisdisconnected() is called with exclusive net lock.
The new code also works without net lock.

OK mvs@
sys/netinet/raw_ip.c