static void __dead
usage(void)
{
- fprintf(stderr, "usage: doas [-nsv] [-a style] [-C config] [-u user]"
- " command [args]\n");
+ fprintf(stderr, "usage: doas [-nsv] "
+#ifdef HAVE_BSD_AUTH_H
+ "[-a style] "
+#endif
+ "[-C config] [-u user] command [args]\n");
exit(1);
}
setprogname("doas");
- if (pledge("stdio rpath getpw tty proc exec id", NULL) == -1)
+ if (pledge("stdio rpath getpw tty recvfd proc exec id", NULL) == -1)
err(1, "pledge");
- /* closefrom(STDERR_FILENO + 1); */
+ closefrom(STDERR_FILENO + 1);
uid = getuid();
#ifdef HAVE_BSD_AUTH_H
# define OPTSTRING "a:C:nsu:v"
#else
-# define OPTSTRING "C:nsu:v"
+# define OPTSTRING "+C:nsu:v"
#endif
while ((ch = getopt(argc, argv, OPTSTRING)) != -1) {
if (sflag) {
sh = getenv("SHELL");
- if (sh == NULL || *sh == '\0')
- shargv[0] = pw->pw_shell;
- else
+ if (sh == NULL || *sh == '\0') {
+ shargv[0] = strdup(pw->pw_shell);
+ if (shargv[0] == NULL)
+ err(1, NULL);
+ } else
shargv[0] = sh;
argv = shargv;
argc = 1;
parseconfig("/etc/doas.conf", 1);
/* cmdline is used only for logging, no need to abort on truncate */
- (void) strlcpy(cmdline, argv[0], sizeof(cmdline));
+ (void)strlcpy(cmdline, argv[0], sizeof(cmdline));
for (i = 1; i < argc; i++) {
if (strlcat(cmdline, " ", sizeof(cmdline)) >= sizeof(cmdline))
break;
cmd = argv[0];
if (!permit(uid, groups, ngroups, &rule, target, cmd,
- (const char**)argv + 1)) {
+ (const char **)argv + 1)) {
syslog(LOG_AUTHPRIV | LOG_NOTICE,
"failed command for %s: %s", myname, cmdline);
errc(1, EPERM, NULL);
LOGIN_SETUSER) != 0)
errx(1, "failed to set user context for target");
#else
- warn(pw->pw_name);
if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) != 0)
errx(1, "setresgid");
if (initgroups(pw->pw_name, pw->pw_gid) != 0)