From: Alex Rousskov Date: Sun, 13 Jul 2014 03:10:16 +0000 (-0600) Subject: Reduce cache_effective_user was leaking $HOME memory X-Git-Tag: SQUID_3_4_7~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b8f8828e4c5e24b1e6649ac08a779625037f159;p=thirdparty%2Fsquid.git 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. --- 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();