From: Valentine Krasnobaeva Date: Tue, 4 Mar 2025 10:04:01 +0000 (+0100) Subject: BUG/MEIDUM: startup: return to initial cwd only after check_config_validity() X-Git-Tag: v3.2-dev7~25 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e900ef987e4167cf0921e97b09059d757f2c0ea5;p=thirdparty%2Fhaproxy.git BUG/MEIDUM: startup: return to initial cwd only after check_config_validity() In check_config_validity() we evaluate some sample fetch expressions (log-format, server rules, etc). These expressions may use external files like maps. If some particular 'default-path' was set in the global section before, it's no longer applied to resolve file pathes in check_config_validity(). parse_cfg() at the end of config parsing switches back to the initial cwd. This fixes the issue #2886. This patch should be backported in all stable versions since 2.4.0, including 2.4.0. --- diff --git a/include/haproxy/cfgparse.h b/include/haproxy/cfgparse.h index 5b8bc0759..760d54e01 100644 --- a/include/haproxy/cfgparse.h +++ b/include/haproxy/cfgparse.h @@ -110,6 +110,7 @@ extern char *cursection; extern int non_global_section_parsed; extern struct proxy *curproxy; +extern char initial_cwd[PATH_MAX]; int cfg_parse_global(const char *file, int linenum, char **args, int inv); int cfg_parse_listen(const char *file, int linenum, char **args, int inv); diff --git a/src/cfgparse.c b/src/cfgparse.c index 75d044fb8..c99a7339e 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -121,7 +121,7 @@ static enum default_path_mode { DEFAULT_PATH_ORIGIN, /* "origin": paths are relative to default_path_origin */ } default_path_mode; -static char initial_cwd[PATH_MAX]; +char initial_cwd[PATH_MAX]; static char current_cwd[PATH_MAX]; /* List head of all known configuration keywords */ @@ -2668,11 +2668,6 @@ section_parser: err_code |= ERR_ALERT | ERR_FATAL | ERR_ABORT; } - if (*initial_cwd && chdir(initial_cwd) == -1) { - ha_alert("Impossible to get back to initial directory '%s' : %s\n", initial_cwd, strerror(errno)); - err_code |= ERR_ALERT | ERR_FATAL; - } - err: ha_free(&cfg_scope); cursection = NULL; diff --git a/src/haproxy.c b/src/haproxy.c index 90b89f9b8..8804d0529 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2052,6 +2052,10 @@ static void step_init_2(int argc, char** argv) /* Note: global.nbthread will be initialized as part of this call */ err_code |= check_config_validity(); + if (*initial_cwd && chdir(initial_cwd) == -1) { + ha_alert("Impossible to get back to initial directory '%s' : %s\n", initial_cwd, strerror(errno)); + exit(1); + } /* update the ready date to also account for the check time */ clock_update_date(0, 1);