]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix #485: Unbound occasionally reports broken stats.
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Fri, 7 May 2021 09:13:44 +0000 (11:13 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Fri, 7 May 2021 09:13:44 +0000 (11:13 +0200)
daemon/remote.c
doc/Changelog
services/mesh.c
smallapp/unbound-control.c

index 7e432fe52bb4c78a7254ac32f725350365a059a1..5836c0c7986177a81e4069e579d19a215be0922c 100644 (file)
@@ -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
 }
 
index cf306ea6bf901f48f51ec7017b598a096da3e4dd..61fd924c378c22be3cb211703ad768bbefd2516b 100644 (file)
@@ -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.
index 88b3d15d083344d27494d74ab355302ecd65c8a2..7931a072f4184e616c44ede752424df58714dc4d 100644 (file)
@@ -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
 }
 
index 86e3949c021558fcb89b2f02219af85f076e7497..af72f2a4ef9e5b962a71484aa0bbcbb64ee810c7 100644 (file)
@@ -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
 }