From: Christopher Faulet Date: Thu, 4 Jun 2026 19:53:31 +0000 (+0200) Subject: BUG/MEDIUM: server/checks: Support healtcheck keyword on default-server lines X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=f7bc8246ee3839b49d8c7a623b93b5a2ffb5fa0e;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: server/checks: Support healtcheck keyword on default-server lines The healthcheck keyword could be parsed on default-server lines but not copied during server initialization, making it ineffective. But there is also a true issue by setting it on a default-server. The pseudo server used to parse the default-server line is not initialized via the new_server() function, as regular servers. So there is no tcpcheck information inherited from the proxy. We must take care of that when the "healthcheck" keyword is parsed to avoid crashes. This patch must be backported to 3.4. --- diff --git a/src/server.c b/src/server.c index 23b6322bf..2cf2ac34b 100644 --- a/src/server.c +++ b/src/server.c @@ -2978,6 +2978,19 @@ void srv_settings_cpy(struct server *srv, const struct server *src, int srv_tmpl srv->check.alpn_len = src->check.alpn_len; } } + if (src->check.tcpcheck && src->check.tcpcheck->healthcheck) { + struct tcpcheck *tcpcheck = NULL; + + tcpcheck = calloc(1, sizeof(*tcpcheck)); + if (tcpcheck) { + LIST_INIT(&tcpcheck->preset_vars); + tcpcheck->healthcheck = strdup(src->check.tcpcheck->healthcheck); + if (tcpcheck->healthcheck == NULL) + ha_free(&tcpcheck); + } + if (tcpcheck) + srv->check.tcpcheck = tcpcheck; + } if (!(srv->flags & SRV_F_RHTTP)) srv->check.reuse_pool = src->check.reuse_pool; diff --git a/src/tcpcheck.c b/src/tcpcheck.c index a1ee85f4d..4d01f2f3b 100644 --- a/src/tcpcheck.c +++ b/src/tcpcheck.c @@ -5970,7 +5970,7 @@ static int srv_parse_healthcheck(char **args, int *cur_arg, struct proxy *curpx, goto out; } - if (srv->check.tcpcheck->healthcheck) { + if (srv->check.tcpcheck && srv->check.tcpcheck->healthcheck) { /* a healthcheck section was already defined. Replace it */ ha_free(&srv->check.tcpcheck->healthcheck); }