]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.20.6/tcp-allow-msg_zerocopy-transmission-also-in-close_wait-state.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.20.6 / tcp-allow-msg_zerocopy-transmission-also-in-close_wait-state.patch
CommitLineData
38551f4f
GKH
1From foo@baz Sat Jan 26 10:22:50 CET 2019
2From: Willem de Bruijn <willemb@google.com>
3Date: Thu, 10 Jan 2019 14:40:33 -0500
4Subject: tcp: allow MSG_ZEROCOPY transmission also in CLOSE_WAIT state
5
6From: Willem de Bruijn <willemb@google.com>
7
8[ Upstream commit 13d7f46386e060df31b727c9975e38306fa51e7a ]
9
10TCP transmission with MSG_ZEROCOPY fails if the peer closes its end of
11the connection and so transitions this socket to CLOSE_WAIT state.
12
13Transmission in close wait state is acceptable. Other similar tests in
14the stack (e.g., in FastOpen) accept both states. Relax this test, too.
15
16Link: https://www.mail-archive.com/netdev@vger.kernel.org/msg276886.html
17Link: https://www.mail-archive.com/netdev@vger.kernel.org/msg227390.html
18Fixes: f214f915e7db ("tcp: enable MSG_ZEROCOPY")
19Reported-by: Marek Majkowski <marek@cloudflare.com>
20Signed-off-by: Willem de Bruijn <willemb@google.com>
21CC: Yuchung Cheng <ycheng@google.com>
22CC: Neal Cardwell <ncardwell@google.com>
23CC: Soheil Hassas Yeganeh <soheil@google.com>
24CC: Alexey Kodanev <alexey.kodanev@oracle.com>
25Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
26Reviewed-by: Eric Dumazet <edumazet@google.com>
27Signed-off-by: David S. Miller <davem@davemloft.net>
28Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
29---
30 net/ipv4/tcp.c | 2 +-
31 1 file changed, 1 insertion(+), 1 deletion(-)
32
33--- a/net/ipv4/tcp.c
34+++ b/net/ipv4/tcp.c
35@@ -1186,7 +1186,7 @@ int tcp_sendmsg_locked(struct sock *sk,
36 flags = msg->msg_flags;
37
38 if (flags & MSG_ZEROCOPY && size && sock_flag(sk, SOCK_ZEROCOPY)) {
39- if (sk->sk_state != TCP_ESTABLISHED) {
40+ if ((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) {
41 err = -EINVAL;
42 goto out_err;
43 }