From: David Howells <dhowells@xxxxxxxxxx> Date: Wed, 7 Jun 2023 15:05:54 +0100 > Allow splice to undo the effects of MSG_MORE after prematurely ending a > splice/sendfile due to getting an EOF condition (->splice_read() returned > 0) after splice had called sendmsg() with MSG_MORE set when the user didn't > set MSG_MORE. > > Suggested-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > Link: https://lore.kernel.org/r/CAHk-=wh=V579PDYvkpnTobCLGczbgxpMgGmmhqiTyE34Cpi5Gg@xxxxxxxxxxxxxx/ > Signed-off-by: David Howells <dhowells@xxxxxxxxxx> > cc: Tom Herbert <tom@xxxxxxxxxxxxxxx> > cc: Tom Herbert <tom@xxxxxxxxxxxxxx> > cc: Cong Wang <cong.wang@xxxxxxxxxxxxx> > cc: Jakub Kicinski <kuba@xxxxxxxxxx> > cc: Eric Dumazet <edumazet@xxxxxxxxxx> > cc: "David S. Miller" <davem@xxxxxxxxxxxxx> > cc: Paolo Abeni <pabeni@xxxxxxxxxx> > cc: Jens Axboe <axboe@xxxxxxxxx> > cc: Matthew Wilcox <willy@xxxxxxxxxxxxx> > cc: netdev@xxxxxxxxxxxxxxx > --- > net/kcm/kcmsock.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c > index ba22af16b96d..d0d8c54562d6 100644 > --- a/net/kcm/kcmsock.c > +++ b/net/kcm/kcmsock.c > @@ -968,6 +968,19 @@ static int kcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) > return err; > } > > +static void kcm_splice_eof(struct socket *sock) > +{ > + struct sock *sk = sock->sk; > + struct kcm_sock *kcm = kcm_sk(sk); > + > + if (skb_queue_empty(&sk->sk_write_queue)) nit: would be better to use skb_queue_empty_lockless(). > + return; > + > + lock_sock(sk); > + kcm_write_msgs(kcm); > + release_sock(sk); > +} > + > static ssize_t kcm_sendpage(struct socket *sock, struct page *page, > int offset, size_t size, int flags) > > @@ -1773,6 +1786,7 @@ static const struct proto_ops kcm_dgram_ops = { > .sendmsg = kcm_sendmsg, > .recvmsg = kcm_recvmsg, > .mmap = sock_no_mmap, > + .splice_eof = kcm_splice_eof, > .sendpage = kcm_sendpage, > }; > > @@ -1794,6 +1808,7 @@ static const struct proto_ops kcm_seqpacket_ops = { > .sendmsg = kcm_sendmsg, > .recvmsg = kcm_recvmsg, > .mmap = sock_no_mmap, > + .splice_eof = kcm_splice_eof, > .sendpage = kcm_sendpage, > .splice_read = kcm_splice_read, > };