]> git.armaanb.net Git - opendoas.git/blobdiff - doas.c
checkconfig doesn't return anymore, noted by zhuk
[opendoas.git] / doas.c
diff --git a/doas.c b/doas.c
index 618027b0aed023d1746372b18e8d4de560685fe8..12c65302fd1fc4c04d2449f338f7a7bc834db1d7 100644 (file)
--- a/doas.c
+++ b/doas.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: doas.c,v 1.22 2015/07/26 17:24:02 zhuk Exp $ */
+/* $OpenBSD: doas.c,v 1.26 2015/07/26 20:47:01 espie Exp $ */
 /*
  * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org>
  *
@@ -282,9 +282,10 @@ fail(void)
        exit(1);
 }
 
-static int
+static void __dead
 checkconfig(const char *confpath, int argc, char **argv,
-    uid_t uid, gid_t *groups, int ngroups, uid_t target) {
+    uid_t uid, gid_t *groups, int ngroups, uid_t target)
+{
        struct rule *rule;
 
        setresuid(uid, uid, uid);
@@ -295,10 +296,10 @@ checkconfig(const char *confpath, int argc, char **argv,
        if (permit(uid, groups, ngroups, &rule, target, argv[0],
            (const char **)argv + 1)) {
                printf("permit%s\n", (rule->options & NOPASS) ? " nopass" : "");
-               return 1;
+               exit(0);
        } else {
                printf("deny\n");
-               return 0;
+               exit(1);
        }
 }
 
@@ -321,8 +322,10 @@ main(int argc, char **argv, char **envp)
        int ngroups;
        int i, ch;
        int sflag = 0;
+       int nflag = 0;
 
-       while ((ch = getopt(argc, argv, "C:su:")) != -1) {
+       uid = getuid();
+       while ((ch = getopt(argc, argv, "C:nsu:")) != -1) {
                switch (ch) {
                case 'C':
                        confpath = optarg;
@@ -331,6 +334,9 @@ main(int argc, char **argv, char **envp)
                        if (parseuid(optarg, &target) != 0)
                                errx(1, "unknown user");
                        break;
+               case 'n':
+                       nflag = 1;
+                       break;
                case 's':
                        sflag = 1;
                        break;
@@ -369,15 +375,16 @@ main(int argc, char **argv, char **envp)
                argc = 1;
        }
 
-       if (confpath)
-               exit(!checkconfig(confpath, argc, argv, uid, groups, ngroups,
-                   target));
+       if (confpath) {
+               checkconfig(confpath, argc, argv, uid, groups, ngroups,
+                   target);
+               exit(1);        /* fail safe */
+       }
+
        parseconfig("/etc/doas.conf", 1);
 
        /* cmdline is used only for logging, no need to abort on truncate */
-       (void) strlcpy(cmdline, argv[0], sizeof(cmdline)) < sizeof(cmdline);
-       if (strlcpy(cmdline, argv[0], sizeof(cmdline)) >= sizeof(cmdline))
-               errx(1, "command line too long");
+       (void) strlcpy(cmdline, argv[0], sizeof(cmdline));
        for (i = 1; i < argc; i++) {
                if (strlcat(cmdline, " ", sizeof(cmdline)) >= sizeof(cmdline))
                        break;
@@ -394,6 +401,8 @@ main(int argc, char **argv, char **envp)
        }
 
        if (!(rule->options & NOPASS)) {
+               if (nflag)
+                       errx(1, "Authorization required");
                if (!auth_userokay(myname, NULL, NULL, NULL)) {
                        syslog(LOG_AUTHPRIV | LOG_NOTICE,
                            "failed password for %s", myname);