sudo

changeset 5410:3057fde43cf0 1.6

Make insert_env() check for and remove dupes after we replace an
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  /*