From f7bc8246ee3839b49d8c7a623b93b5a2ffb5fa0e Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Thu, 4 Jun 2026 21:53:31 +0200 Subject: [PATCH] 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. --- src/server.c | 13 +++++++++++++ src/tcpcheck.c | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) 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); }