From: Aurelien DARRAGON Date: Mon, 28 Jul 2025 18:14:53 +0000 (+0200) Subject: BUG/MINOR: hlua: take default-path into account with lua-load-per-thread X-Git-Tag: v3.0.12~91 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=5f777b1a09a69e0466074d7eb8dd18b1e497cb39;p=haproxy-3.0.git BUG/MINOR: hlua: take default-path into account with lua-load-per-thread As discussed in GH #3051, default-path is not taken into account when loading files using lua-load-per-thread. In fact, the initial hlua_load_state() (performed on first thread which parses the config) is successful, but other threads run hlua_load_state() later based on config hints which were saved by the first thread, and those config hints only contain the file path provided on the lua-load-per-thread config line, not the absolute one. Indeed, `default-path` directive changes the current working directory only for the thread parsing the configuration. To fix the issue, when storing config hints under hlua_load_per_thread() we now make sure to save the absolute file path for `lua-load-per-thread' argument. Thanks to GH user @zhanhb for having reported the issue It may be backported to all stable versions. (cherry picked from commit 2ffe515d97a80318f1f3a84f8e18015500b8ef01) Signed-off-by: Willy Tarreau (cherry picked from commit ac1be87c8359abad1c1a55f5ea6822d4362706db) Signed-off-by: Christopher Faulet (cherry picked from commit 0ea8c5bd38ef8b85f7efaa2ae3e4543127bee4e4) Signed-off-by: Christopher Faulet --- diff --git a/src/hlua.c b/src/hlua.c index e0b647b..0b87d9f 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -13209,7 +13209,24 @@ static int hlua_load_per_thread(char **args, int section_type, struct proxy *cur return -1; } for (i = 1; *(args[i]) != 0; i++) { - per_thread_load[len][i - 1] = strdup(args[i]); + /* first arg is filename */ + if (i == 1 && args[1][0] != '/') { + char *curpath; + char *fullpath = NULL; + + /* filename is provided using relative path, store the absolute path + * to take current chdir into account for other threads file load + * which occur later + */ + curpath = getcwd(trash.area, trash.size); + if (!curpath) { + memprintf(err, "failed to retrieve cur path"); + return -1; + } + per_thread_load[len][i - 1] = memprintf(&fullpath, "%s/%s", curpath, args[1]); + } + else + per_thread_load[len][i - 1] = strdup(args[i]); if (per_thread_load[len][i - 1] == NULL) { memprintf(err, "out of memory error"); return -1;