summaryrefslogtreecommitdiff
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
authorAndrey A. Chernov <ache@FreeBSD.org>2012-10-12 13:17:19 +0000
committerAndrey A. Chernov <ache@FreeBSD.org>2012-10-12 13:17:19 +0000
commitfeadb30739def278463c21bbf61b0cfab67818e3 (patch)
tree0c2516e5fc855be32d51bfaa629771d17e883564 /lib/libc/stdlib
parent57eec2efebbff19d1737ecbb7c3b1528f3e8b9c5 (diff)
Notes
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/getenv.c10
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);
}