From b9b158ea4cc93ce0f48c3ac92b80dc270d4dbf68 Mon Sep 17 00:00:00 2001 From: William Lallemand Date: Thu, 13 Nov 2025 17:17:11 +0100 Subject: [PATCH] BUG/MINOR: acme: can't override the default resolver httpclient_acme_init() was called in cfg_parse_acme() which is at section parsing. httpclient_acme_init() also calls httpclient_create_proxy() which could create a "default" resolvers section if it doesn't exists. If one tries to override the default resolvers section after an ACME section, the resolvers section parsing will fail because the section was already created by httpclient_create_proxy(). This patch fixes the issue by moving the initialization of the ACME proxy to a pre_check callback, which is called just before check_config_validity(). Must be backported in 3.2. --- src/acme.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/acme.c b/src/acme.c index 5d2c4a778..9d73f311c 100644 --- a/src/acme.c +++ b/src/acme.c @@ -282,14 +282,6 @@ static int cfg_parse_acme(const char *file, int linenum, char **args, int kwm) goto out; } - if (httpclient_acme_px == NULL) { - if (httpclient_acme_init() & ERR_FATAL) { - err_code |= ERR_ALERT | ERR_FATAL; - ha_alert("parsing [%s:%d]: out of memory.\n", file, linenum); - goto out; - } - } - cur_acme = new_acme_cfg(args[1]); if (!cur_acme) { err_code |= ERR_ALERT | ERR_FATAL; @@ -754,6 +746,21 @@ out: return err_code; } +/* initialize the httpclient just before check_config_validity() because it could create a defaults resolver if it + * doesn't exist. */ +static int cfg_precheck_acme() +{ + if (acme_cfgs) { + if (httpclient_acme_init() & ERR_FATAL) { + ha_alert("couldn't initialize the httpclient for ACME.\n"); + return ERR_ABORT; + + } + } + return ERR_NONE; +} +REGISTER_PRE_CHECK(cfg_precheck_acme); + /* postparser function checks if the ACME section was declared */ static int cfg_postparser_acme() {