Page MenuHomeFreeBSD

socket: Remove NOFREE from the socket zone
ClosedPublic

Authored by markj on Sep 15 2021, 7:58 PM.
Tags
None
Referenced Files
Unknown Object (File)
Sat, Apr 27, 4:23 PM
Unknown Object (File)
Feb 20 2024, 6:06 AM
Unknown Object (File)
Feb 15 2024, 4:14 AM
Unknown Object (File)
Feb 15 2024, 4:14 AM
Unknown Object (File)
Feb 15 2024, 3:58 AM
Unknown Object (File)
Dec 12 2023, 3:07 AM
Unknown Object (File)
Dec 1 2023, 6:25 AM
Unknown Object (File)
Dec 1 2023, 6:24 AM
Subscribers

Details

Summary

This flag was added during the transition away from the legacy zone
allocator, commit c897b81311792ccf6a93feff2a405e2ae53f664e. The old
zone allocator effectively provided _NOFREE semantics, but I believe
they are not required for sockets. In particular, we use reference
counting to keep sockets live.

The one case which is kind of weird is sonewconn(), which returns a
pointer to a socket with reference count 0. This socket is still
effectively owned by the listening socket. Protocols must therefore be
careful to synchronize sonewconn() calls with their pru_close
implementations, since for listening sockets soclose() will abort the
child sockets. For example, TCP holds the listening socket's PCB read
locked across the sonewconn() call, which blocks tcp_usr_close().

Eliminating _NOFREE has several benefits: it enables use-after-free
detection (e.g., by KASAN) and lets the system reclaim memory from the
socket zone under memory pressure.

No functional change intended.

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Not Applicable
Unit
Tests Not Applicable