diff options
author | Soheil Hassas Yeganeh <soheil@google.com> | 2018-04-14 20:44:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-04-16 11:23:42 -0400 |
commit | bffd168c3fc5cc7d2bad4c668fa90e7a9010db4b (patch) | |
tree | 7bc9b4df0b4b6a71c89ed1d2363cbea95d816d8c /net/ipv4/tcp.c | |
parent | 4fb0534fb7bbc2346ba7d3a072b538007f4135a5 (diff) |
tcp: clear tp->packets_out when purging write queue
Clear tp->packets_out when purging the write queue, otherwise
tcp_rearm_rto() mistakenly assumes TCP write queue is not empty.
This results in NULL pointer dereference.
Also, remove the redundant `tp->packets_out = 0` from
tcp_disconnect(), since tcp_disconnect() calls
tcp_write_queue_purge().
Fixes: a27fd7a8ed38 (tcp: purge write queue upon RST)
Reported-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Reported-by: Sami Farin <hvtaifwkbgefbaei@gmail.com>
Tested-by: Sami Farin <hvtaifwkbgefbaei@gmail.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
Acked-by: Yuchung Cheng <ycheng@google.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r-- | net/ipv4/tcp.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 4fa3f812b9ff..9ce1c726185e 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -2368,6 +2368,7 @@ void tcp_write_queue_purge(struct sock *sk) | |||
2368 | INIT_LIST_HEAD(&tcp_sk(sk)->tsorted_sent_queue); | 2368 | INIT_LIST_HEAD(&tcp_sk(sk)->tsorted_sent_queue); |
2369 | sk_mem_reclaim(sk); | 2369 | sk_mem_reclaim(sk); |
2370 | tcp_clear_all_retrans_hints(tcp_sk(sk)); | 2370 | tcp_clear_all_retrans_hints(tcp_sk(sk)); |
2371 | tcp_sk(sk)->packets_out = 0; | ||
2371 | } | 2372 | } |
2372 | 2373 | ||
2373 | int tcp_disconnect(struct sock *sk, int flags) | 2374 | int tcp_disconnect(struct sock *sk, int flags) |
@@ -2417,7 +2418,6 @@ int tcp_disconnect(struct sock *sk, int flags) | |||
2417 | icsk->icsk_backoff = 0; | 2418 | icsk->icsk_backoff = 0; |
2418 | tp->snd_cwnd = 2; | 2419 | tp->snd_cwnd = 2; |
2419 | icsk->icsk_probes_out = 0; | 2420 | icsk->icsk_probes_out = 0; |
2420 | tp->packets_out = 0; | ||
2421 | tp->snd_ssthresh = TCP_INFINITE_SSTHRESH; | 2421 | tp->snd_ssthresh = TCP_INFINITE_SSTHRESH; |
2422 | tp->snd_cwnd_cnt = 0; | 2422 | tp->snd_cwnd_cnt = 0; |
2423 | tp->window_clamp = 0; | 2423 | tp->window_clamp = 0; |