From 5b8f8828e4c5e24b1e6649ac08a779625037f159 Mon Sep 17 00:00:00 2001 From: Alex Rousskov Date: Sat, 12 Jul 2014 21:10:16 -0600 Subject: [PATCH] Reduce cache_effective_user was leaking $HOME memory putenv() leaks memory by design but there is no need to use it at all when the path is unchanged. --- src/cache_cf.cc | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/cache_cf.cc b/src/cache_cf.cc index 38ac506212..eb7e069ce8 100644 --- a/src/cache_cf.cc +++ b/src/cache_cf.cc @@ -893,16 +893,18 @@ configDoConfigure(void) Config2.effectiveGroupID = pwd->pw_gid; #if HAVE_PUTENV - - if (pwd->pw_dir && *pwd->pw_dir) { - int len; - char *env_str = (char *)xcalloc((len = strlen(pwd->pw_dir) + 6), 1); - snprintf(env_str, len, "HOME=%s", pwd->pw_dir); - putenv(env_str); + if (pwd->pw_dir && *pwd->pw_dir) { + // putenv() leaks by design; avoid leaks when nothing changes + static String lastDir; + if (!lastDir.size() || lastDir != pwd->pw_dir) { + lastDir = pwd->pw_dir; + int len = strlen(pwd->pw_dir) + 6; + char *env_str = (char *)xcalloc(len, 1); + snprintf(env_str, len, "HOME=%s", pwd->pw_dir); + putenv(env_str); + } } - #endif - } } else { Config2.effectiveUserID = geteuid(); -- 2.47.2