sockets: on shutdown(2) do sorflush() only in case of generic sockbuf

This is a quick plug to fix panic with Netlink which has protocol specific
buffers.  Note that PF_UNIX/SOCK_DGRAM, which also has its own buffers,
avoids the panic due to being SOCK_DGRAM.  A correct but more complicated
fix that needs to be done is to merge pr_shutdown, pr_flush and dom_dispose
into one protocol method that may call sorflush for generic sockets or do
their own stuff for protocol which has own buffers.

Reviewed by:		tuexen
Differential Revision:	https://reviews.freebsd.org/D43367
Reported-by: syzbot+a58e1615881c01a51653@syzkaller.appspotmail.com
This commit is contained in:
Gleb Smirnoff 2024-01-08 17:20:31 -08:00
parent af9f4ac57a
commit 59ce044a78

View file

@ -3007,7 +3007,7 @@ soshutdown(struct socket *so, int how)
pr = so->so_proto;
if (pr->pr_flush != NULL)
pr->pr_flush(so, how);
if (how != SHUT_WR)
if (how != SHUT_WR && !(pr->pr_flags & PR_SOCKBUF))
sorflush(so);
if (how != SHUT_RD) {
error = pr->pr_shutdown(so);