diff options
Diffstat (limited to 'net/ipv4/tcp_input.c')
| -rw-r--r-- | net/ipv4/tcp_input.c | 16 | 
1 files changed, 10 insertions, 6 deletions
| diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 1e37c1388189..a9d9555a973f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -579,10 +579,12 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock *sk,  		u32 delta = tcp_time_stamp(tp) - tp->rx_opt.rcv_tsecr;  		u32 delta_us; -		if (!delta) -			delta = 1; -		delta_us = delta * (USEC_PER_SEC / TCP_TS_HZ); -		tcp_rcv_rtt_update(tp, delta_us, 0); +		if (likely(delta < INT_MAX / (USEC_PER_SEC / TCP_TS_HZ))) { +			if (!delta) +				delta = 1; +			delta_us = delta * (USEC_PER_SEC / TCP_TS_HZ); +			tcp_rcv_rtt_update(tp, delta_us, 0); +		}  	}  } @@ -2910,9 +2912,11 @@ static bool tcp_ack_update_rtt(struct sock *sk, const int flag,  	if (seq_rtt_us < 0 && tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr &&  	    flag & FLAG_ACKED) {  		u32 delta = tcp_time_stamp(tp) - tp->rx_opt.rcv_tsecr; -		u32 delta_us = delta * (USEC_PER_SEC / TCP_TS_HZ); -		seq_rtt_us = ca_rtt_us = delta_us; +		if (likely(delta < INT_MAX / (USEC_PER_SEC / TCP_TS_HZ))) { +			seq_rtt_us = delta * (USEC_PER_SEC / TCP_TS_HZ); +			ca_rtt_us = seq_rtt_us; +		}  	}  	rs->rtt_us = ca_rtt_us; /* RTT of last (S)ACKed packet (or -1) */  	if (seq_rtt_us < 0) | 
