sudo
changeset 5410:3057fde43cf0 1.6
Make insert_env() check for and remove dupes after we replace an
existing value.
existing value.
| author | Todd C. Miller <Todd.Miller@courtesan.com> |
|---|---|
| date | Fri May 28 10:01:51 2010 -0400 (20 months ago) |
| parents | a099cb714df6 |
| children | f7398cfbac71 |
| files | env.c |
line diff
1.1 --- a/env.c Fri May 28 09:57:42 2010 -0400 1.2 +++ b/env.c Fri May 28 10:01:51 2010 -0400 1.3 @@ -270,6 +270,7 @@ 1.4 { 1.5 char **nep; 1.6 size_t varlen; 1.7 + int found = FALSE; 1.8 1.9 /* Make sure there is room for the new entry plus a NULL. */ 1.10 if (e->env_len + 2 > e->env_size) { 1.11 @@ -278,20 +279,34 @@ 1.12 } 1.13 1.14 if (dupcheck) { 1.15 - varlen = (strchr(str, '=') - str) + 1; 1.16 + varlen = (strchr(str, '=') - str) + 1; 1.17 1.18 - for (nep = e->envp; *nep; nep++) { 1.19 + for (nep = e->envp; !found && *nep != NULL; nep++) { 1.20 + if (strncmp(str, *nep, varlen) == 0) { 1.21 + *nep = str; 1.22 + found = TRUE; 1.23 + } 1.24 + } 1.25 + /* Prune out duplicate variables. */ 1.26 + if (found) { 1.27 + while (*nep != NULL) { 1.28 if (strncmp(str, *nep, varlen) == 0) { 1.29 - *nep = str; 1.30 - return; 1.31 + memmove(nep, nep + 1, 1.32 + (e->env_len - (nep - e->envp)) * sizeof(char *)); 1.33 + e->env_len--; 1.34 + } else { 1.35 + nep++; 1.36 } 1.37 } 1.38 - } else 1.39 + } 1.40 + } 1.41 + 1.42 + if (!found) { 1.43 nep = e->envp + e->env_len; 1.44 - 1.45 - e->env_len++; 1.46 - *nep++ = str; 1.47 - *nep = NULL; 1.48 + e->env_len++; 1.49 + *nep++ = str; 1.50 + *nep = NULL; 1.51 + } 1.52 } 1.53 1.54 /*
