]> git.armaanb.net Git - opendoas.git/blobdiff - doas.c
Handle empty argv
[opendoas.git] / doas.c
diff --git a/doas.c b/doas.c
index ac3a42a3a171cd96680ed34446278f3dc1f8d473..d348d2554b6f23a5c364ccccc8c8ce64cc09bf58 100644 (file)
--- a/doas.c
+++ b/doas.c
@@ -35,6 +35,7 @@
 #include <syslog.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <time.h>
 
 #include "openbsd.h"
 #include "doas.h"
@@ -235,6 +236,18 @@ mygetpwuid_r(uid_t uid, struct passwd *pwd, struct passwd **result)
        return rv;
 }
 
+void
+authfail(int opt)
+{
+
+#ifdef DOAS_INSULTS
+       if (opt)
+               printf("%s\n", getinsult());
+#endif
+
+       errx(1, "Authentication failed");
+}
+
 int
 main(int argc, char **argv)
 {
@@ -260,6 +273,11 @@ main(int argc, char **argv)
        const char *cwd;
        char **envp;
 
+       if (argc <= 0 || argv == NULL || argv[0] == NULL) {
+               fprintf(stderr, "doas: executed without argv\n");
+               exit(1);
+       }
+
        setprogname("doas");
 
        closefrom(STDERR_FILENO + 1);
@@ -349,19 +367,14 @@ main(int argc, char **argv)
                errc(1, EPERM, NULL);
        }
 
-#if defined(USE_SHADOW)
        if (!(rule->options & NOPASS)) {
                if (nflag)
                        errx(1, "Authentication required");
 
-               shadowauth(mypw->pw_name, rule->options & PERSIST);
+               int ret = shadowauth(mypw->pw_name, rule->options & PERSIST);
+               if (ret == 5)
+                       authfail(rule->options & INSULT);
        }
-#elif !defined(USE_PAM)
-       /* no authentication provider, only allow NOPASS rules */
-       (void) nflag;
-       if (!(rule->options & NOPASS))
-               errx(1, "Authentication required");
-#endif
 
        if ((p = getenv("PATH")) != NULL)
                formerpath = strdup(p);
@@ -379,11 +392,6 @@ main(int argc, char **argv)
        if (targpw == NULL)
                errx(1, "no passwd entry for target");
 
-#if defined(USE_PAM)
-       pamauth(targpw->pw_name, mypw->pw_name, !nflag, rule->options & NOPASS,
-           rule->options & PERSIST);
-#endif
-
 #ifdef HAVE_LOGIN_CAP_H
        if (setusercontext(NULL, targpw, target, LOGIN_SETGROUP |
            LOGIN_SETPATH |