From f3d9e608d73fae1a7f00341cb52371e4b2181c66 Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Tue, 22 May 2018 18:40:07 +0200 Subject: [PATCH] BUG/MEDIUM: dns: Delay the attempt to run a DNS resolution on check failure. When checks fail, the code tries to run a dns resolution, in case the IP changed. The old way of doing that was to check, in case the last dns resolution hadn't expired yet, if there were an applicable IP, which should be useless, because it has already be done when the resolution was first done, or to run a new resolution. Both are a locking nightmare, and lead to deadlocks, so instead, just wake the resolvers task, that should do the trick. This should be backported to 1.8. --- src/dns.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/dns.c b/src/dns.c index 385ecbb6d..9984e2c31 100644 --- a/src/dns.c +++ b/src/dns.c @@ -348,11 +348,9 @@ void dns_trigger_resolution(struct dns_requester *req) /* The resolution must not be triggered yet. Use the cached response, if * valid */ exp = tick_add(res->last_resolution, resolvers->hold.valid); - if (res->status == RSLV_STATUS_VALID && - tick_isset(res->last_resolution) && !tick_is_expired(exp, now_ms)) - req->requester_cb(req, NULL); - else - dns_run_resolution(res); + if (resolvers->t && (res->status != RSLV_STATUS_VALID || + !tick_isset(res->last_resolution) || tick_is_expired(exp, now_ms))) + task_wakeup(resolvers->t, TASK_WOKEN_OTHER); }