]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: resolvers: Use tick_first() to update the resolvers task timeout
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 14 Dec 2022 09:26:25 +0000 (10:26 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 14 Dec 2022 09:44:17 +0000 (10:44 +0100)
In resolv_update_resolvers_timeout(), the resolvers task timeout is updated
by checking running and waiting resolutions. However, to find the next
wakeup date, MIN() operator is used to compare ticks. Ticks must never be
compared with such operators, tick helper functions must be used, to
properly handled TICK_ETERNITY value. In this case, tick_first() must be
used instead of MIN().

It is an old bug but it is pretty visible since the commit fdecaf6ae4
("BUG/MINOR: resolvers: do not run the timeout task when there's no
resolution"). Because of this bug, the resolvers task timeout may be set to
TICK_ETERNITY, stopping periodic resolutions.

This patch should solve the issue #1962. It must be backported to all stable
versions.

src/resolvers.c

index 6696e51a367aa62b952a7bfa0a3b6804e8fa14b0..e415c6a611d66fe4a0cdfbc90730aa2cf32adb28 100644 (file)
@@ -291,11 +291,11 @@ static void resolv_update_resolvers_timeout(struct resolvers *resolvers)
        if (!LIST_ISEMPTY(&resolvers->resolutions.curr)) {
                res  = LIST_NEXT(&resolvers->resolutions.curr, struct resolv_resolution *, list);
                next = tick_add(now_ms, resolvers->timeout.resolve);
-               next = MIN(next, tick_add(res->last_query, resolvers->timeout.retry));
+               next = tick_first(next, tick_add(res->last_query, resolvers->timeout.retry));
        }
 
        list_for_each_entry(res, &resolvers->resolutions.wait, list)
-               next = MIN(next, tick_add(res->last_resolution, resolv_resolution_timeout(res)));
+               next = tick_first(next, tick_add(res->last_resolution, resolv_resolution_timeout(res)));
 
        resolvers->t->expire = next;
        task_queue(resolvers->t);