diff --git a/lib/roken/putenv.c b/lib/roken/putenv.c index 835413b3e..e717e77b2 100644 --- a/lib/roken/putenv.c +++ b/lib/roken/putenv.c @@ -47,30 +47,34 @@ extern char **environ; * Makes the value of the environment variable name equal to * value by altering an existing variable or creating a new one. */ -int putenv(const char *string) + +int +putenv(const char *string) { int i; + const char *eq = (const char *)strchr(string, '='); int len; - len = string - strchr(string, '=') + 1; + if (eq == NULL) + return 1; + len = eq - string; - if(environ == NULL){ + if(environ == NULL) { environ = malloc(sizeof(char*)); if(environ == NULL) return 1; environ[0] = NULL; } - for(i = 0; environ[i]; i++) - if(strncmp(string, environ[i], len)){ - environ[len] = string; + for(i = 0; environ[i] != NULL; i++) + if(strncmp(string, environ[i], len) == 0) { + environ[i] = string; return 0; } - environ = realloc(environ, sizeof(char*) * (i + 1)); + environ = realloc(environ, sizeof(char*) * (i + 2)); if(environ == NULL) return 1; - environ[i] = string; + environ[i] = string; environ[i+1] = NULL; return 0; } -