]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: resolvers: Wait the resolution execution for a do_resolv action
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 11 Jan 2023 09:31:10 +0000 (10:31 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 11 Jan 2023 09:31:42 +0000 (10:31 +0100)
The do_resolv action triggers a resolution and must wait for the
result. Concretely, if no cache entry is available, it creates a resolution
and wakes up the resolvers task. Then it yields. When the action is
recalled, if the resolution is still running, it yields again.

However, if the resolution is not running, it does not check it was
running. Thus, it is possible to ignore the resolution because the action
was recalled before the resolvers task had a chance to be executed. If there
is result, the action must yield.

This patch should fix the issue #1993. It must be backported as far as 2.0.

src/resolvers.c

index e415c6a611d66fe4a0cdfbc90730aa2cf32adb28..60873b567d46d7fdfb58f73470e6e8fc13f6b52b 100644 (file)
@@ -2930,7 +2930,12 @@ enum act_return resolv_action_do_resolve(struct act_rule *rule, struct proxy *px
                if (resolution->step == RSLV_STEP_RUNNING)
                        goto yield;
                if (resolution->step == RSLV_STEP_NONE) {
-                       /* We update the variable only if we have a valid response. */
+                       /* We update the variable only if we have a valid
+                        * response. If the response was not received yet, we
+                        * must yield.
+                        */
+                       if (resolution->status == RSLV_STATUS_NONE)
+                               goto yield;
                        if (resolution->status == RSLV_STATUS_VALID) {
                                struct sample smp;
                                short ip_sin_family = 0;