Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dccp: switch rx_tstamp_last_feedback to monotonic clock

To compute delays, better not use time of the day which can
be changed by admins or malicious programs.

Also change ccid3_first_li() to use s64 type for delta variable
to avoid potential overflows.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Cc: dccp@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Eric Dumazet and committed by
David S. Miller
0ce4e70f 74174fe5

+7 -4
+7 -4
net/dccp/ccids/ccid3.c
··· 600 600 { 601 601 struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); 602 602 struct dccp_sock *dp = dccp_sk(sk); 603 - ktime_t now = ktime_get_real(); 603 + ktime_t now = ktime_get(); 604 604 s64 delta = 0; 605 605 606 606 switch (fbtype) { ··· 632 632 return; 633 633 } 634 634 635 - ccid3_pr_debug("Interval %ldusec, X_recv=%u, 1/p=%u\n", (long)delta, 635 + ccid3_pr_debug("Interval %lldusec, X_recv=%u, 1/p=%u\n", delta, 636 636 hc->rx_x_recv, hc->rx_pinv); 637 637 638 638 hc->rx_tstamp_last_feedback = now; ··· 679 679 static u32 ccid3_first_li(struct sock *sk) 680 680 { 681 681 struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); 682 - u32 x_recv, p, delta; 682 + u32 x_recv, p; 683 + s64 delta; 683 684 u64 fval; 684 685 685 686 if (hc->rx_rtt == 0) { ··· 688 687 hc->rx_rtt = DCCP_FALLBACK_RTT; 689 688 } 690 689 691 - delta = ktime_to_us(net_timedelta(hc->rx_tstamp_last_feedback)); 690 + delta = ktime_us_delta(ktime_get(), hc->rx_tstamp_last_feedback); 691 + if (delta <= 0) 692 + delta = 1; 692 693 x_recv = scaled_div32(hc->rx_bytes_recv, delta); 693 694 if (x_recv == 0) { /* would also trigger divide-by-zero */ 694 695 DCCP_WARN("X_recv==0\n");