From: Alan T. DeKok Date: Wed, 5 Jul 2023 00:07:56 +0000 (-0400) Subject: update exec_build_env() to return environment variables. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f43e7b256e2afbd44d07c8e90f0113371bbc8adb;p=thirdparty%2Ffreeradius-server.git update exec_build_env() to return environment variables. It wasn't doing that previously. :( --- diff --git a/src/lib/server/exec.c b/src/lib/server/exec.c index 93b9989c9e0..a87eb4872b2 100644 --- a/src/lib/server/exec.c +++ b/src/lib/server/exec.c @@ -382,39 +382,53 @@ static NEVER_RETURNS void exec_child(char **argv, char **envp, exit(2); } -/** Merge extra environmental vairables and potentially the inherited environment +/** Merge extra environmental variables and potentially the inherited environment * * @param[in] env_in to merge. * @param[in] env_inherit inherite environment from radiusd. * @return merged environmental variables. */ -static inline CC_HINT(always_inline) +static char **exec_build_env(char **env_in, bool env_inherit) { - char **env; + size_t num_in, num_environ; - if (env_in && !env_in[0]) { - char **env_out_p, **env_end, **env_in_p; + /* + * Not inheriting the radiusd environment, just return whatever we were given. + */ + if (!env_inherit) { + return env_in; + } - env_out_p = env_exec_arr; - env_end = env_out_p + NUM_ELEMENTS(env_exec_arr); - if (env_inherit) { - for (env_in_p = environ; (env_out_p < env_end) && *env_in_p; env_in_p++, env_out_p++) *env_out_p = *env_in_p; - } - for (env_in_p = env_in; (env_out_p < env_end) && *env_in_p; env_in_p++, env_out_p++) *env_out_p = *env_in_p; - if (env_out_p == env_end) { - fr_strerror_printf("Too many enivronmental variables specified"); - return NULL; - } - env = env_exec_arr; - } else if (env_inherit) { - env = environ; - } else { - env = env_exec_arr; - env[0] = NULL; + /* + * No additional environment variables, just return the ones from radiusd. + */ + if (!env_in) return environ; + + for (num_environ = 0; environ[num_environ] != NULL; num_environ++) { + /* nothing */ } - return env; + /* + * No room to copy anything after the environment variables. + */ + if (((num_environ + 1) == NUM_ELEMENTS(env_exec_arr))) { + return environ; + } + + /* + * Copy the radiusd environment to the local array + */ + memcpy(env_exec_arr, environ, num_environ + 1); + + for (num_in = 0; env_in[num_in] != NULL; num_in++) { + if ((num_environ + num_in + 1) >= NUM_ELEMENTS(env_exec_arr)) break; + } + + memcpy(env_exec_arr + num_environ, env_in, num_in); + env_exec_arr[num_environ + num_in] = NULL; + + return env_exec_arr; } /** Execute a program without waiting for the program to finish.