From 953f07503aa695009aab729370e458dc26784a8b Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 29 Mar 2013 23:42:50 +0800 Subject: [PATCH] Fixed bug #64544 (Valgrind warnings after using putenv) The frozen_envion is needed, since if an item in environ is updated (like the test script HOME one), invalid free still shows up --- NEWS | 1 + sapi/cli/ps_title.c | 12 +++++++----- sapi/cli/tests/bug64544.phpt | 20 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 sapi/cli/tests/bug64544.phpt diff --git a/NEWS b/NEWS index c1cd3e1ab5d..c8b71167221 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ PHP NEWS 28 Mar 2013, PHP 5.5.0 Beta 2 - Core: + . Fixed bug #64544 (Valgrind warnings after using putenv). (Laruence) . Fixed bug #64515 (Memoryleak when using the same variablename 2times in function declaration). (Laruence) . Fixed bug #64503 (Compilation fails with error: conflicting types for diff --git a/sapi/cli/ps_title.c b/sapi/cli/ps_title.c index 730a31b11e7..28830c9082a 100644 --- a/sapi/cli/ps_title.c +++ b/sapi/cli/ps_title.c @@ -128,7 +128,7 @@ static char** save_argv; * This holds the 'locally' allocated environ from the save_ps_args method. * This is subsequently free'd at exit. */ -static char** new_environ; +static char** frozen_environ, **new_environ; /* * Call this method early, before any code has used the original argv passed in @@ -182,7 +182,8 @@ char** save_ps_args(int argc, char** argv) * move the environment out of the way */ new_environ = (char **) malloc((i + 1) * sizeof(char *)); - if (!new_environ) + frozen_environ = (char **) malloc((i + 1) * sizeof(char *)); + if (!new_environ || !frozen_environ) goto clobber_error; for (i = 0; environ[i] != NULL; i++) { @@ -192,6 +193,7 @@ char** save_ps_args(int argc, char** argv) } new_environ[i] = NULL; environ = new_environ; + memcpy((char *)frozen_environ, (char *)new_environ, sizeof(char *) * (i + 1)); } #endif /* PS_USE_CLOBBER_ARGV */ @@ -409,9 +411,9 @@ void cleanup_ps_args(char **argv) #ifdef PS_USE_CLOBBER_ARGV { int i; - for (i = 0; new_environ[i] != NULL; i++) - free(new_environ[i]); - free(new_environ); + for (i = 0; frozen_environ[i] != NULL; i++) + free(frozen_environ[i]); + free(frozen_environ); } #endif /* PS_USE_CLOBBER_ARGV */ diff --git a/sapi/cli/tests/bug64544.phpt b/sapi/cli/tests/bug64544.phpt new file mode 100644 index 00000000000..cc49545c16f --- /dev/null +++ b/sapi/cli/tests/bug64544.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #64544 (Valgrind warnings after using putenv) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +string(4) "/tmp" +string(3) "BAR"