Commit:    953f07503aa695009aab729370e458dc26784a8b
Author:    Xinchen Hui <larue...@php.net>         Fri, 29 Mar 2013 23:42:50 
+0800
Parents:   b2a760fe4564fc6f24e1596f3288617a12aa2c55
Branches:  PHP-5.5

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=953f07503aa695009aab729370e458dc26784a8b

Log:
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

Bugs:
https://bugs.php.net/64544

Changed paths:
  M  NEWS
  M  sapi/cli/ps_title.c
  A  sapi/cli/tests/bug64544.phpt


Diff:
diff --git a/NEWS b/NEWS
index c1cd3e1..c8b7116 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 730a31b..28830c9 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 0000000..cc49545
--- /dev/null
+++ b/sapi/cli/tests/bug64544.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #64544 (Valgrind warnings after using putenv)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) == "WIN") {
+       die("skip non windows test");
+}
+?>
+--FILE--
+<?php
+
+putenv("HOME=/tmp");
+var_dump(getenv("HOME"));
+
+putenv("FOO=BAR");
+var_dump(getenv("FOO"));
+?>
+--EXPECTF--
+string(4) "/tmp"
+string(3) "BAR"


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to