Code

Don't smash stack when $GIT_ALTERNATE_OBJECT_DIRECTORIES is too long
[git.git] / compat / setenv.c
index 94acd2da9e2e95f9f9a72061d9575de6079dcaec..3a22ea7b751efb768d72afa2f97fd963e10eec7e 100644 (file)
@@ -1,5 +1,4 @@
-#include <stdlib.h>
-#include <string.h>
+#include "../git-compat-util.h"
 
 int gitsetenv(const char *name, const char *value, int replace)
 {
@@ -16,7 +15,7 @@ int gitsetenv(const char *name, const char *value, int replace)
 
        namelen = strlen(name);
        valuelen = strlen(value);
-       envstr = malloc((namelen + valuelen + 2) * sizeof(char));
+       envstr = malloc((namelen + valuelen + 2));
        if (!envstr) return -1;
 
        memcpy(envstr, name, namelen);
@@ -25,7 +24,11 @@ int gitsetenv(const char *name, const char *value, int replace)
        envstr[namelen + valuelen + 1] = 0;
 
        out = putenv(envstr);
+       /* putenv(3) makes the argument string part of the environment,
+        * and changing that string modifies the environment --- which
+        * means we do not own that storage anymore.  Do not free
+        * envstr.
+        */
 
-       free(envstr);
        return out;
 }