fix two my_setenv/my_clearenv bugs
authorMarkus Jansen <Markus.Jansen@ericsson.com>
Fri, 3 May 2013 14:02:30 +0000 (15:02 +0100)
committerDavid Mitchell <davem@iabyn.com>
Fri, 3 May 2013 14:25:42 +0000 (15:25 +0100)
RT #117121. This commit fixes two bugs. First, some old glibc's can crash
if unsetenv() is called with a null environ.

Secondly, the code in Perl_my_clearenv(), when freeing env vars with a
name longer than 80 chars, reallocs a tmp buffer, but didn't
update the buf lencausing this to fail under valgrind:

    $ENV{"a"x 90}=1; local %ENV;

util.c

index 1fd1e00..42fd70f 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1957,7 +1957,8 @@ Perl_my_setenv(pTHX_ const char *nam, const char *val)
 #   else
 #       if defined(HAS_UNSETENV)
         if (val == NULL) {
-            (void)unsetenv(nam);
+            if (environ) /* old glibc can crash with null environ */
+                (void)unsetenv(nam);
         } else {
            const int nlen = strlen(nam);
            const int vlen = strlen(val);
@@ -6124,6 +6125,7 @@ Perl_my_clearenv(pTHX)
       if (bsiz < l + 1) {
         (void)safesysfree(buf);
         bsiz = l + 1; /* + 1 for the \0. */
+        bufsiz = bsiz * sizeof(char); /* keep bsiz and bufsiz in sync */
         buf = (char*)safesysmalloc(bufsiz);
       } 
       memcpy(buf, *environ, l);