- for (i = 0; envp[i] != NULL; i++) {
- struct envnode *node;
- const char *e, *eq;
-
- e = envp[i];
-
- if ((eq = strchr(e, '=')) == NULL || eq == e)
- continue;
- node = malloc(sizeof(*node));
- if (!node)
- err(1, NULL);
- node->key = strndup(envp[i], eq - e);
- node->value = strdup(eq + 1);
- if (!node->key || !node->value)
- err(1, NULL);
- if (RB_FIND(envtree, &env->root, node)) {
- free((char *)node->key);
- free((char *)node->value);
- free(node);
- } else {
- RB_INSERT(envtree, &env->root, node);
- env->count++;
+ addnode(env, "DOAS_USER", mypw->pw_name);
+ addnode(env, "HOME", targpw->pw_dir);
+ addnode(env, "LOGNAME", targpw->pw_name);
+ addnode(env, "PATH", getenv("PATH"));
+ addnode(env, "SHELL", targpw->pw_shell);
+ addnode(env, "USER", targpw->pw_name);
+
+ fillenv(env, copyset);
+
+ if (rule->options & KEEPENV) {
+ extern char **environ;
+
+ for (i = 0; environ[i] != NULL; i++) {
+ struct envnode *node;
+ const char *e, *eq;
+ size_t len;
+ char keybuf[1024];
+
+ e = environ[i];
+
+ /* ignore invalid or overlong names */
+ if ((eq = strchr(e, '=')) == NULL || eq == e)
+ continue;
+ len = eq - e;
+ if (len > sizeof(keybuf) - 1)
+ continue;
+ memcpy(keybuf, e, len);
+ keybuf[len] = '\0';
+
+ node = createnode(keybuf, eq + 1);
+ if (RB_INSERT(envtree, &env->root, node)) {
+ /* ignore any later duplicates */
+ freenode(node);
+ } else {
+ env->count++;
+ }