| From foo@baz Tue Mar 6 19:02:56 PST 2018 |
| From: Soheil Hassas Yeganeh <soheil@google.com> |
| Date: Tue, 27 Feb 2018 18:32:18 -0500 |
| Subject: tcp: purge write queue upon RST |
| |
| From: Soheil Hassas Yeganeh <soheil@google.com> |
| |
| |
| [ Upstream commit a27fd7a8ed3856faaf5a2ff1c8c5f00c0667aaa0 ] |
| |
| When the connection is reset, there is no point in |
| keeping the packets on the write queue until the connection |
| is closed. |
| |
| RFC 793 (page 70) and RFC 793-bis (page 64) both suggest |
| purging the write queue upon RST: |
| https://tools.ietf.org/html/draft-ietf-tcpm-rfc793bis-07 |
| |
| Moreover, this is essential for a correct MSG_ZEROCOPY |
| implementation, because userspace cannot call close(fd) |
| before receiving zerocopy signals even when the connection |
| is reset. |
| |
| Fixes: f214f915e7db ("tcp: enable MSG_ZEROCOPY") |
| Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com> |
| Reviewed-by: Eric Dumazet <edumazet@google.com> |
| Signed-off-by: Yuchung Cheng <ycheng@google.com> |
| Signed-off-by: Neal Cardwell <ncardwell@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv4/tcp_input.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/net/ipv4/tcp_input.c |
| +++ b/net/ipv4/tcp_input.c |
| @@ -3988,6 +3988,7 @@ void tcp_reset(struct sock *sk) |
| /* This barrier is coupled with smp_rmb() in tcp_poll() */ |
| smp_wmb(); |
| |
| + tcp_write_queue_purge(sk); |
| tcp_done(sk); |
| |
| if (!sock_flag(sk, SOCK_DEAD)) |