diff options
| author | Andrey A. Chernov <ache@FreeBSD.org> | 2012-10-12 13:17:19 +0000 |
|---|---|---|
| committer | Andrey A. Chernov <ache@FreeBSD.org> | 2012-10-12 13:17:19 +0000 |
| commit | feadb30739def278463c21bbf61b0cfab67818e3 (patch) | |
| tree | 0c2516e5fc855be32d51bfaa629771d17e883564 /lib/libc/stdlib | |
| parent | 57eec2efebbff19d1737ecbb7c3b1528f3e8b9c5 (diff) | |
Notes
Diffstat (limited to 'lib/libc/stdlib')
| -rw-r--r-- | lib/libc/stdlib/getenv.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/libc/stdlib/getenv.c b/lib/libc/stdlib/getenv.c index b7826d72a5d4..47963d53dd62 100644 --- a/lib/libc/stdlib/getenv.c +++ b/lib/libc/stdlib/getenv.c @@ -662,6 +662,7 @@ unsetenv(const char *name) { int envNdx; size_t nameLen; + int newEnvActive; /* Check for malformed name. */ if (name == NULL || (nameLen = __strleneq(name)) == 0) { @@ -674,13 +675,18 @@ unsetenv(const char *name) return (-1); /* Deactivate specified variable. */ + /* Remove all occurrences. */ envNdx = envVarsTotal - 1; - if (__findenv(name, nameLen, &envNdx, true) != NULL) { + newEnvActive = envActive; + while (__findenv(name, nameLen, &envNdx, true) != NULL) { envVars[envNdx].active = false; if (envVars[envNdx].putenv) __remove_putenv(envNdx); - __rebuild_environ(envActive - 1); + envNdx--; + newEnvActive--; } + if (newEnvActive != envActive) + __rebuild_environ(newEnvActive); return (0); } |
