]>
Commit | Line | Data |
---|---|---|
38551f4f GKH |
1 | From foo@baz Sat Jan 26 10:22:50 CET 2019 |
2 | From: Willem de Bruijn <willemb@google.com> | |
3 | Date: Thu, 10 Jan 2019 14:40:33 -0500 | |
4 | Subject: tcp: allow MSG_ZEROCOPY transmission also in CLOSE_WAIT state | |
5 | ||
6 | From: Willem de Bruijn <willemb@google.com> | |
7 | ||
8 | [ Upstream commit 13d7f46386e060df31b727c9975e38306fa51e7a ] | |
9 | ||
10 | TCP transmission with MSG_ZEROCOPY fails if the peer closes its end of | |
11 | the connection and so transitions this socket to CLOSE_WAIT state. | |
12 | ||
13 | Transmission in close wait state is acceptable. Other similar tests in | |
14 | the stack (e.g., in FastOpen) accept both states. Relax this test, too. | |
15 | ||
16 | Link: https://www.mail-archive.com/netdev@vger.kernel.org/msg276886.html | |
17 | Link: https://www.mail-archive.com/netdev@vger.kernel.org/msg227390.html | |
18 | Fixes: f214f915e7db ("tcp: enable MSG_ZEROCOPY") | |
19 | Reported-by: Marek Majkowski <marek@cloudflare.com> | |
20 | Signed-off-by: Willem de Bruijn <willemb@google.com> | |
21 | CC: Yuchung Cheng <ycheng@google.com> | |
22 | CC: Neal Cardwell <ncardwell@google.com> | |
23 | CC: Soheil Hassas Yeganeh <soheil@google.com> | |
24 | CC: Alexey Kodanev <alexey.kodanev@oracle.com> | |
25 | Acked-by: Soheil Hassas Yeganeh <soheil@google.com> | |
26 | Reviewed-by: Eric Dumazet <edumazet@google.com> | |
27 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
28 | Signed-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 | } |