From: Christopher Faulet Date: Tue, 12 Jan 2021 16:29:45 +0000 (+0100) Subject: BUG/MINOR: check: Don't perform any check on servers defined in a frontend X-Git-Tag: v2.4-dev6~66 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6ecd59326f7416dcba215f05a6674d4b9f970749;p=thirdparty%2Fhaproxy.git BUG/MINOR: check: Don't perform any check on servers defined in a frontend 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. --- diff --git a/src/check.c b/src/check.c index 51ae99ebfc..55470d5515 100644 --- a/src/check.c +++ b/src/check.c @@ -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; }