timer: handle time going backwards. master origin/master
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 23 Mar 2021 03:06:50 +0000 (13:36 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 23 Mar 2021 03:06:50 +0000 (13:36 +1030)
As seen in https://github.com/ElementsProject/lightning/issues/4401

OpenBSD 6.8 inside VirtualBox.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/timer/timer.c

index 48bded19656456a500703d77d509ba750053bbda..ef6b27742679f4cbccc006d1db81d4cc83ec09fa 100644 (file)
@@ -108,13 +108,10 @@ void timer_addrel(struct timers *timers, struct timer *t, struct timerel rel)
 
        t->time = time_to_grains(timemono_add(time_mono(), rel));
 
-#if TIME_HAVE_MONOTONIC
-       assert(t->time >= timers->base);
-#else
        /* Added in the past?  Treat it as imminent. */
        if (t->time < timers->base)
                t->time = timers->base;
-#endif
+
        if (t->time < timers->first)
                timers->first = t->time;
 
@@ -346,7 +343,11 @@ struct timer *timers_expire(struct timers *timers, struct timemono expire)
        unsigned int off;
        struct timer *t;
 
-       assert(now >= timers->base);
+       /* This can happen without TIME_HAVE_MONOTONIC, but I also have
+        * a report of OpenBSD 6.8 under virtualbox doing this. */
+       if (now < timers->base) {
+               return NULL;
+       }
 
        if (!timers->level[0]) {
                if (list_empty(&timers->far))