Move the RB_ code from doas.h to env.c, and limit the environment interface to a
authormartijn <martijn@openbsd.org>
Sun, 19 Jun 2016 19:29:43 +0000 (19:29 +0000)
committermartijn <martijn@openbsd.org>
Sun, 19 Jun 2016 19:29:43 +0000 (19:29 +0000)
simple prepenv function.

OK tedu@

usr.bin/doas/doas.c
usr.bin/doas/doas.h
usr.bin/doas/env.c

index a542a76..aca4a04 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: doas.c,v 1.56 2016/06/16 17:40:30 tedu Exp $ */
+/* $OpenBSD: doas.c,v 1.57 2016/06/19 19:29:43 martijn Exp $ */
 /*
  * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org>
  *
@@ -204,7 +204,7 @@ checkconfig(const char *confpath, int argc, char **argv,
 }
 
 int
-main(int argc, char **argv, char **envp)
+main(int argc, char **argv)
 {
        const char *safepath = "/bin:/sbin:/usr/bin:/usr/sbin:"
            "/usr/local/bin:/usr/local/sbin";
@@ -212,7 +212,6 @@ main(int argc, char **argv, char **envp)
        char *shargv[] = { NULL, NULL };
        char *sh;
        const char *cmd;
-       struct env *env;
        char cmdline[LINE_MAX];
        char myname[_PW_NAME_LEN + 1];
        struct passwd *pw;
@@ -227,6 +226,7 @@ main(int argc, char **argv, char **envp)
        char cwdpath[PATH_MAX];
        const char *cwd;
        char *login_style = NULL;
+       char **envp;
 
        setprogname("doas");
 
@@ -373,9 +373,7 @@ main(int argc, char **argv, char **envp)
        syslog(LOG_AUTHPRIV | LOG_INFO, "%s ran command %s as %s from %s",
            myname, cmdline, pw->pw_name, cwd);
 
-       env = createenv(envp);
-       env = filterenv(env, rule);
-       envp = flattenenv(env);
+       envp = prepenv(rule);
 
        if (rule->cmd) {
                if (setenv("PATH", safepath, 1) == -1)
index 36f93b5..067483e 100644 (file)
@@ -1,20 +1,4 @@
-/* $OpenBSD: doas.h,v 1.7 2016/06/16 17:40:30 tedu Exp $ */
-
-#include <sys/tree.h>
-
-struct envnode {
-       RB_ENTRY(envnode) node;
-       const char *key;
-       const char *value;
-};
-
-struct env {
-       RB_HEAD(envtree, envnode) root;
-       u_int count;
-};
-
-RB_PROTOTYPE(envtree, envnode, node, envcmp)
-
+/* $OpenBSD: doas.h,v 1.8 2016/06/19 19:29:43 martijn Exp $ */
 struct rule {
        int action;
        int options;
@@ -31,9 +15,7 @@ extern int parse_errors;
 
 size_t arraylen(const char **);
 
-struct env *createenv(char **);
-struct env *filterenv(struct env *, struct rule *);
-char **flattenenv(struct env *);
+char **prepenv(struct rule *);
 
 #define PERMIT 1
 #define DENY   2
index 03ce306..2f67602 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: env.c,v 1.1 2016/06/16 17:40:30 tedu Exp $ */
+/* $OpenBSD: env.c,v 1.2 2016/06/19 19:29:43 martijn Exp $ */
 /*
  * Copyright (c) 2016 Ted Unangst <tedu@openbsd.org>
  *
@@ -16,6 +16,7 @@
  */
 
 #include <sys/types.h>
+#include <sys/tree.h>
 
 #include <string.h>
 #include <stdio.h>
 
 #include "doas.h"
 
+struct envnode {
+       RB_ENTRY(envnode) node;
+       const char *key;
+       const char *value;
+};
+
+struct env {
+       RB_HEAD(envtree, envnode) root;
+       u_int count;
+};
+
 int
 envcmp(struct envnode *a, struct envnode *b)
 {
        return strcmp(a->key, b->key);
 }
-RB_GENERATE(envtree, envnode, node, envcmp)
+RB_GENERATE_STATIC(envtree, envnode, node, envcmp)
+
+struct env *createenv(char **);
+struct env *filterenv(struct env *, struct rule *);
+char **flattenenv(struct env *);
 
 struct env *
 createenv(char **envp)
@@ -151,3 +167,14 @@ filterenv(struct env *orig, struct rule *rule)
 
        return copy;
 }
+
+char **
+prepenv(struct rule *rule)
+{
+       extern char **environ;
+       struct env *env;
+       
+       env = createenv(environ);
+       env = filterenv(env, rule);
+       return flattenenv(env);
+}