diff --git a/src/bin/pg_ctl/pg_ctl.cpp b/src/bin/pg_ctl/pg_ctl.cpp index e4edb88b5184c6f43a404765327e91fe9b99ef76..9f41e64643d0fc0ea266df4cce2109375dd53ad2 100755 --- a/src/bin/pg_ctl/pg_ctl.cpp +++ b/src/bin/pg_ctl/pg_ctl.cpp @@ -7332,6 +7332,10 @@ static void free_ctl() FREE_AND_RESET(register_password); FREE_AND_RESET(pgha_str); FREE_AND_RESET(pgha_opt); + FREE_AND_RESET(exec_path); + FREE_AND_RESET(pg_data); + FREE_AND_RESET(pg_config); + FREE_AND_RESET(pgxcCommand); FREE_AND_RESET(ss_instance_config.dss.vgname); FREE_AND_RESET(ss_instance_config.dss.vgdata); } diff --git a/src/common/port/exec.cpp b/src/common/port/exec.cpp index 0ba9bf37f3892e70cbbf72555bcc083a3a73767a..0f5add06ff8cf9132197eacbd58cdf845dbfde97 100644 --- a/src/common/port/exec.cpp +++ b/src/common/port/exec.cpp @@ -572,9 +572,6 @@ void set_pglocale_pgservice(const char* argv0, const char* app) char path[MAXPGPATH]; char my_exec_path[MAXPGPATH]; - /* longer than PGLOCALEDIR */ - char env_path[MAXPGPATH + sizeof("PGSYSCONFDIR=")]; - /* don't set LC_ALL in the backend */ if (strcmp(app, PG_TEXTDOMAIN("gaussdb")) != 0) { (void)gs_setlocale_r(LC_ALL, ""); @@ -589,40 +586,14 @@ void set_pglocale_pgservice(const char* argv0, const char* app) bindtextdomain(app, path); textdomain(app); - if (gs_getenv_r("PGLOCALEDIR") == NULL) { - char* ptr = NULL; - /* set for libpq to use */ - errno_t rc = snprintf_s(env_path, sizeof(env_path), sizeof(env_path) - 1, "PGLOCALEDIR=%s", path); - securec_check_ss_c(rc, "\0", "\0"); - canonicalize_path(env_path + 12); -#ifdef FRONTEND - ptr = strdup(env_path); -#else - ptr = MemoryContextStrdup(THREAD_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR), env_path); -#endif - if (ptr != NULL) { - gs_putenv_r(ptr); - } - } + gs_setnev_r("PGLOCALEDIR", path, 0); #endif if (gs_getenv_r("PGSYSCONFDIR") == NULL) { - char* ptr = NULL; - get_etc_path(my_exec_path, path, sizeof(path)); /* set for libpq to use */ - errno_t rc = snprintf_s(env_path, sizeof(env_path), sizeof(env_path) - 1, "PGSYSCONFDIR=%s", path); - securec_check_ss_c(rc, "\0", "\0"); - canonicalize_path(env_path + 13); -#ifdef FRONTEND - ptr = strdup(env_path); -#else - ptr = MemoryContextStrdup(THREAD_GET_MEM_CXT_GROUP(MEMORY_CONTEXT_EXECUTOR), env_path); -#endif - if (ptr != NULL) { - gs_putenv_r(ptr); - } + gs_setenv_r("PGSYSCONFDIR", path, 0); } } diff --git a/src/common/port/gs_env_r.cpp b/src/common/port/gs_env_r.cpp index 62f990585a3928d5c4b5df075b8b517639dcecdc..d45904202d15b28cd5b7cf52dcb008513996c484 100644 --- a/src/common/port/gs_env_r.cpp +++ b/src/common/port/gs_env_r.cpp @@ -30,6 +30,7 @@ extern void pgwin32_unsetenv(const char*); int gs_putenv_r(char* envvar); char* gs_getenv_r(const char* name); +int gs_setenv_r(const char* name, const char* envvar, int overwrite); int gs_unsetenv_r(const char* name); #endif @@ -50,6 +51,15 @@ char* gs_getenv_r(const char* name) return ret; } +int gs_setenv_r(const char* name, const char* envvar, int overwrite) +{ + int ret; + (void)syscalllockAcquire(&env_lock); + ret = setenv(name, envvar, overwrite); + (void)syscalllockRelease(&env_lock); + return ret; +} + int gs_unsetenv_r(const char* name) { int ret; diff --git a/src/include/port.h b/src/include/port.h index 73090a8a2473146b0546ee1657b9c7f7be58e74f..a44a6b8e3d3d33f63b63d9bd56a88719273bac9c 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -429,6 +429,7 @@ extern struct dirent* gs_readdir(DIR* dir); /*env thread safe version*/ extern int gs_putenv_r(char* envvar); +extern int gs_setenv_r(const char* name, const char* envvar, int overwrite); extern char* gs_getenv_r(const char* name); #endif /* PG_PORT_H */