tcp: avoid possible arithmetic overflows
icsk_rto is a 32bit field, and icsk_backoff can reach 15 by default, or more if some sysctl (eg tcp_retries2) are changed. Better use 64bit to perform icsk_rto << icsk_backoff operations As Joe Perches suggested, add a helper for this. Yuchung spotted the tcp_v4_err() case. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
35f7aa5309
commit
fcdd1cf4dd
@@ -3279,6 +3279,7 @@ void tcp_send_probe0(struct sock *sk)
|
||||
{
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
unsigned long probe_max;
|
||||
int err;
|
||||
|
||||
err = tcp_write_wakeup(sk);
|
||||
@@ -3294,9 +3295,7 @@ void tcp_send_probe0(struct sock *sk)
|
||||
if (icsk->icsk_backoff < sysctl_tcp_retries2)
|
||||
icsk->icsk_backoff++;
|
||||
icsk->icsk_probes_out++;
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0,
|
||||
min(icsk->icsk_rto << icsk->icsk_backoff, TCP_RTO_MAX),
|
||||
TCP_RTO_MAX);
|
||||
probe_max = TCP_RTO_MAX;
|
||||
} else {
|
||||
/* If packet was not sent due to local congestion,
|
||||
* do not backoff and do not remember icsk_probes_out.
|
||||
@@ -3306,11 +3305,11 @@ void tcp_send_probe0(struct sock *sk)
|
||||
*/
|
||||
if (!icsk->icsk_probes_out)
|
||||
icsk->icsk_probes_out = 1;
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0,
|
||||
min(icsk->icsk_rto << icsk->icsk_backoff,
|
||||
TCP_RESOURCE_PROBE_INTERVAL),
|
||||
TCP_RTO_MAX);
|
||||
probe_max = TCP_RESOURCE_PROBE_INTERVAL;
|
||||
}
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0,
|
||||
inet_csk_rto_backoff(icsk, probe_max),
|
||||
TCP_RTO_MAX);
|
||||
}
|
||||
|
||||
int tcp_rtx_synack(struct sock *sk, struct request_sock *req)
|
||||
|
||||
Reference in New Issue
Block a user