]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: check: Don't perform any check on servers defined in a frontend
authorChristopher Faulet <cfaulet@haproxy.com>
Tue, 12 Jan 2021 16:29:45 +0000 (17:29 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 12 Jan 2021 16:55:22 +0000 (17:55 +0100)
If a server is defined in a frontend, thus a proxy without the backend
capability, the 'check' and 'agent-check' keywords are ignored. This way, no
check is performed on an ignored server. This avoids a segfault because some
part of the tcpchecks are not fully initialized (or released for frontends
during the post-check).

In addition, an test on the server's proxy capabilities is performed when
checks or agent-checks are initialized and nothing is performed for servers
attached to a non-backend proxy.

This patch should fix the issue #1043. It must be backported as far as 2.2.

src/check.c

index 51ae99ebfcbe742f6032d44b20726a9cf8958091..55470d55157d70ae60228163aa5d542934f0ba92 100644 (file)
@@ -1272,7 +1272,7 @@ static int init_srv_check(struct server *srv)
        int ret = ERR_NONE;
        int check_type;
 
-       if (!srv->do_check)
+       if (!srv->do_check || !(srv->proxy->cap & PR_CAP_BE))
                goto out;
 
        check_type = srv->check.tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK;
@@ -1397,7 +1397,7 @@ static int init_srv_agent_check(struct server *srv)
        const char *err;
        int ret = ERR_NONE;
 
-       if (!srv->do_agent)
+       if (!srv->do_agent || !(srv->proxy->cap & PR_CAP_BE))
                goto out;
 
        /* If there is no connect rule preceding all send / expect rules, an
@@ -1551,6 +1551,12 @@ static int srv_parse_agent_check(char **args, int *cur_arg, struct proxy *curpx,
        if (srv->do_agent)
                goto out;
 
+       if (!(curpx->cap & PR_CAP_BE)) {
+               memprintf(errmsg, "'%s' ignored because %s '%s' has no backend capability",
+                         args[*cur_arg], proxy_type_str(curpx), curpx->id);
+               return ERR_WARN;
+       }
+
        if (!rules) {
                rules = calloc(1, sizeof(*rules));
                if (!rules) {
@@ -1750,6 +1756,12 @@ static int srv_parse_no_agent_check(char **args, int *cur_arg, struct proxy *cur
 static int srv_parse_check(char **args, int *cur_arg, struct proxy *curpx, struct server *srv,
                           char **errmsg)
 {
+       if (!(curpx->cap & PR_CAP_BE)) {
+               memprintf(errmsg, "'%s' ignored because %s '%s' has no backend capability",
+                         args[*cur_arg], proxy_type_str(curpx), curpx->id);
+               return ERR_WARN;
+       }
+
        srv->do_check = 1;
        return 0;
 }