X-Git-Url: https://git.armaanb.net/?p=opendoas.git;a=blobdiff_plain;f=env.c;h=e2286fc83b0232425f67a8cda355ef1453f7739f;hp=42a0d2e1856f8c766c87338ef95b5bd33d74bf3f;hb=HEAD;hpb=5e9d76849fdad47f59b11993ee8ca319bd11414d diff --git a/env.c b/env.c index 42a0d2e..e2286fc 100644 --- a/env.c +++ b/env.c @@ -15,6 +15,8 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include "config.h" + #include #include "sys-tree.h" @@ -24,9 +26,12 @@ #include #include #include +#include +#include "openbsd.h" #include "doas.h" -#include "includes.h" + +const char *formerpath; struct envnode { RB_ENTRY(envnode) node; @@ -39,6 +44,8 @@ struct env { u_int count; }; +static void fillenv(struct env *env, const char **envlist); + static int envcmp(struct envnode *a, struct envnode *b) { @@ -69,9 +76,24 @@ freenode(struct envnode *node) free(node); } +static void +addnode(struct env *env, const char *key, const char *value) +{ + struct envnode *node; + + node = createnode(key, value); + RB_INSERT(envtree, &env->root, node); + env->count++; +} + static struct env * -createenv(struct rule *rule) +createenv(const struct rule *rule, const struct passwd *mypw, + const struct passwd *targpw) { + static const char *copyset[] = { + "DISPLAY", "TERM", + NULL + }; struct env *env; u_int i; @@ -81,8 +103,17 @@ createenv(struct rule *rule) RB_INIT(&env->root); env->count = 0; + 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 const char **environ; + extern char **environ; for (i = 0; environ[i] != NULL; i++) { struct envnode *node; @@ -172,10 +203,17 @@ fillenv(struct env *env, const char **envlist) /* assign value or inherit from environ */ if (eq) { val = eq + 1; - if (*val == '$') - val = getenv(val + 1); + if (*val == '$') { + if (strcmp(val + 1, "PATH") == 0) + val = formerpath; + else + val = getenv(val + 1); + } } else { - val = getenv(name); + if (strcmp(name, "PATH") == 0) + val = formerpath; + else + val = getenv(name); } /* at last, we have something to insert */ if (val) { @@ -187,20 +225,12 @@ fillenv(struct env *env, const char **envlist) } char ** -prepenv(struct rule *rule) +prepenv(const struct rule *rule, const struct passwd *mypw, + const struct passwd *targpw) { - static const char *safeset[] = { - "DISPLAY", "HOME", "LOGNAME", "MAIL", - "PATH", "TERM", "USER", "USERNAME", - NULL - }; struct env *env; - - env = createenv(rule); - /* if we started with blank, fill some defaults then apply rules */ - if (!(rule->options & KEEPENV)) - fillenv(env, safeset); + env = createenv(rule, mypw, targpw); if (rule->envlist) fillenv(env, rule->envlist);