From: W.C.A. Wijngaards Date: Fri, 7 May 2021 09:13:44 +0000 (+0200) Subject: - Fix #485: Unbound occasionally reports broken stats. X-Git-Tag: release-1.13.2rc1~174 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07fda669e45ca6068dc490b79ad9c918b5aa10a3;p=thirdparty%2Funbound.git - Fix #485: Unbound occasionally reports broken stats. --- diff --git a/daemon/remote.c b/daemon/remote.c index 7e432fe52..5836c0c79 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -130,7 +130,7 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, long long d) { #ifndef S_SPLINT_S size_t leftover; - if(d == 0) { + if(d <= 0) { avg->tv_sec = 0; avg->tv_usec = 0; return; @@ -139,7 +139,13 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, long long d) avg->tv_usec = sum->tv_usec / d; /* handle fraction from seconds divide */ leftover = sum->tv_sec - avg->tv_sec*d; - avg->tv_usec += (leftover*1000000)/d; + if(leftover <= 0) + leftover = 0; + avg->tv_usec += (((long long)leftover)*((long long)1000000))/d; + if(avg->tv_sec < 0) + avg->tv_sec = 0; + if(avg->tv_usec < 0) + avg->tv_usec = 0; #endif } diff --git a/doc/Changelog b/doc/Changelog index cf306ea6b..61fd924c3 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,6 @@ +7 May 2021: Wouter + - Fix #485: Unbound occasionally reports broken stats. + 4 May 2021: George - Fix for #367: only attempt to get the interface for queries that are no longer on the tcp_waiting_list. diff --git a/services/mesh.c b/services/mesh.c index 88b3d15d0..7931a072f 100644 --- a/services/mesh.c +++ b/services/mesh.c @@ -99,7 +99,7 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d) { #ifndef S_SPLINT_S size_t leftover; - if(d == 0) { + if(d <= 0) { avg->tv_sec = 0; avg->tv_usec = 0; return; @@ -108,7 +108,13 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d) avg->tv_usec = sum->tv_usec / d; /* handle fraction from seconds divide */ leftover = sum->tv_sec - avg->tv_sec*d; - avg->tv_usec += (leftover*1000000)/d; + if(leftover <= 0) + leftover = 0; + avg->tv_usec += (((long long)leftover)*((long long)1000000))/d; + if(avg->tv_sec < 0) + avg->tv_sec = 0; + if(avg->tv_usec < 0) + avg->tv_usec = 0; #endif } diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c index 86e3949c0..af72f2a4e 100644 --- a/smallapp/unbound-control.c +++ b/smallapp/unbound-control.c @@ -188,7 +188,7 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, long long d) { #ifndef S_SPLINT_S size_t leftover; - if(d == 0) { + if(d <= 0) { avg->tv_sec = 0; avg->tv_usec = 0; return; @@ -197,7 +197,13 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, long long d) avg->tv_usec = sum->tv_usec / d; /* handle fraction from seconds divide */ leftover = sum->tv_sec - avg->tv_sec*d; - avg->tv_usec += (leftover*1000000)/d; + if(leftover <= 0) + leftover = 0; + avg->tv_usec += (((long long)leftover)*((long long)1000000))/d; + if(avg->tv_sec < 0) + avg->tv_sec = 0; + if(avg->tv_usec < 0) + avg->tv_usec = 0; #endif }