version 1.53, 2016/06/05 00:46:34 |
version 1.54, 2016/06/07 14:11:16 |
|
|
|
|
for (i = 0; i < nsafe; i++) { |
for (i = 0; i < nsafe; i++) { |
const char **oe = oldenvp; |
const char **oe = oldenvp; |
|
if (strchr(safeset[i], '=')) |
|
continue; |
while (*oe) { |
while (*oe) { |
size_t len = strlen(safeset[i]); |
size_t len = strlen(safeset[i]); |
if (strncmp(*oe, safeset[i], len) == 0 && |
if (strncmp(*oe, safeset[i], len) == 0 && |
|
|
return -1; |
return -1; |
} |
} |
|
|
/* merge rule->setenvlist into environment list; frees oldenvp */ |
/* merge rule->envlist into environment list; frees oldenvp */ |
static char ** |
static char ** |
dosetenv(char **oldenvp, struct rule *rule) |
dosetenv(char **oldenvp, struct rule *rule) |
{ |
{ |
|
|
if (!(rule->options & SETENV)) |
if (!(rule->options & SETENV)) |
return oldenvp; |
return oldenvp; |
|
|
nset = arraylen(rule->setenvlist); |
nset = arraylen(rule->envlist); |
nold = arraylen((const char**)oldenvp); |
nold = arraylen((const char**)oldenvp); |
|
|
/* insert new variables */ |
/* insert new variables */ |
n = 0; |
n = 0; |
envp = NULL; |
envp = NULL; |
for (i = 0; i < nset; i++) { |
for (i = 0; i < nset; i++) { |
if ((cp = strchr(rule->setenvlist[i], '=')) == NULL) |
if ((cp = strchr(rule->envlist[i], '=')) == NULL) |
errx(1, "invalid setenv"); /* shouldn't happen */ |
continue; |
if (cp[1] == '\0' || cp - rule->setenvlist[i] > INT_MAX) |
if (cp[1] == '\0' || cp - rule->envlist[i] > INT_MAX) |
continue; /* skip variables with empty values */ |
continue; /* skip variables with empty values */ |
if ((envp = reallocarray(envp, n + 2, sizeof(*envp))) == NULL) |
if ((envp = reallocarray(envp, n + 2, sizeof(*envp))) == NULL) |
errx(1, "reallocarray failed"); |
errx(1, "reallocarray failed"); |
|
|
if ((cp2 = getenv(cp + 2)) == NULL) |
if ((cp2 = getenv(cp + 2)) == NULL) |
continue; /* not found; skip */ |
continue; /* not found; skip */ |
if (asprintf(&(envp[n++]), "%.*s=%s", |
if (asprintf(&(envp[n++]), "%.*s=%s", |
(int)(cp - rule->setenvlist[i]), |
(int)(cp - rule->envlist[i]), |
rule->setenvlist[i], cp2) == -1) |
rule->envlist[i], cp2) == -1) |
errx(1, "asprintf failed"); |
errx(1, "asprintf failed"); |
continue; |
continue; |
} else { |
} else { |
/* plain setenv */ |
/* plain setenv */ |
if ((envp[n++] = strdup(rule->setenvlist[i])) == NULL) |
if ((envp[n++] = strdup(rule->envlist[i])) == NULL) |
errx(1, "strdup failed"); |
errx(1, "strdup failed"); |
} |
} |
} |
} |
|
|
for (i = 0; i < nold; i++) { |
for (i = 0; i < nold; i++) { |
if ((cp = strchr(oldenvp[i], '=')) == NULL) |
if ((cp = strchr(oldenvp[i], '=')) == NULL) |
errx(1, "invalid env"); /* shouldn't happen */ |
errx(1, "invalid env"); /* shouldn't happen */ |
found = findenv(rule->setenvlist, oldenvp[i], cp - oldenvp[i]); |
found = findenv(rule->envlist, oldenvp[i], cp - oldenvp[i]); |
if (found != -1) |
if (found != -1) |
free(oldenvp[i]); /* discard */ |
free(oldenvp[i]); /* discard */ |
else { |
else { |