diff options
author | Gleb Smirnoff <glebius@FreeBSD.org> | 2024-01-09 01:20:31 +0000 |
---|---|---|
committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2024-01-09 01:20:31 +0000 |
commit | 59ce044a7856b16803f7eb0aa5c54cfe6e13cff7 (patch) | |
tree | c0151c42689f285cf15afe3696075dd891149412 | |
parent | af9f4ac57ade116293c0a65c5201658b5e424ff6 (diff) | |
download | src-59ce044a7856b16803f7eb0aa5c54cfe6e13cff7.tar.gz src-59ce044a7856b16803f7eb0aa5c54cfe6e13cff7.zip |
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
-rw-r--r-- | sys/kern/uipc_socket.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index efa349d140ff..3409a7085df6 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -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); |