=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sudo/Attic/env.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- src/usr.bin/sudo/Attic/env.c 2010/06/02 19:30:10 1.23 +++ src/usr.bin/sudo/Attic/env.c 2010/07/08 21:11:31 1.24 @@ -317,10 +317,10 @@ unsetenv(var) const char *var; { - char **ep = env.envp; + char **ep; size_t len; - if (strchr(var, '=') != NULL) { + if (var == NULL || *var == '\0' || strchr(var, '=') != NULL) { errno = EINVAL; #ifdef UNSETENV_VOID return; @@ -355,17 +355,18 @@ } len = strlen(var); - while (*ep != NULL) { + for (ep = env.envp; *ep != NULL;) { if (strncmp(var, *ep, len) == 0 && (*ep)[len] == '=') { - /* Found it; shift remainder + NULL over by one and update len. */ - memmove(ep, ep + 1, - (env.env_len - (ep - env.envp)) * sizeof(char *)); - env.env_len--; + /* Found it; shift remainder + NULL over by one. */ + char **cur = ep; + while ((*cur = *(cur + 1)) != NULL) + cur++; /* Keep going, could be multiple instances of the var. */ } else { ep++; } } + env.env_len = ep - env.envp; #ifndef UNSETENV_VOID return(0); #endif @@ -462,13 +463,14 @@ if (found && overwrite) { while (*ep != NULL) { if (strncmp(str, *ep, len) == 0) { - memmove(ep, ep + 1, - (env.env_len - (ep - env.envp)) * sizeof(char *)); - env.env_len--; + char **cur = ep; + while ((*cur = *(cur + 1)) != NULL) + cur++; } else { ep++; } } + env.env_len = ep - env.envp; } }