From 8be8f8df88490f6d9686fcbf2cd50a5b15e2c835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Fri, 24 Jul 2015 10:34:13 +0300 Subject: [PATCH] fix race condition to stop processing dns requests ev_timer_again stops the timer if .repeat is zero, but ares_timeout returns zero timeout if there's events that are already expired. This becomes issue if we were busy processing something else and then c-ares timeouts expire meanwhile, we'd end up not handling them. As a workaround schedule it with small timeout, while this can postpone timeout handling quite a bit, in practice this should work well enough. --- nhrp/nhrp_address.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nhrp/nhrp_address.c b/nhrp/nhrp_address.c index 1ac9fa3..9169cd8 100644 --- a/nhrp/nhrp_address.c +++ b/nhrp/nhrp_address.c @@ -47,7 +47,10 @@ static void ares_prepare_cb(struct ev_loop *loop, struct ev_prepare *w, int reve tv = ares_timeout(r->channel, NULL, &tvbuf); if (tv != NULL) { - r->timeout.repeat = tv->tv_sec + tv->tv_usec * 1e-6; + if (tv->tv_sec || tv->tv_usec) + r->timeout.repeat = tv->tv_sec + tv->tv_usec * 1e-6; + else + r->timeout.repeat = 1e-6; ev_timer_again(&r->timeout); } else { ev_timer_stop(&r->timeout); -- 2.4.6