Allow -k to be specified with a command.

This commit is contained in:
Todd C. Miller
2010-03-15 19:40:15 -04:00
parent e8eec34022
commit 36701e1233

View File

@@ -139,7 +139,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp,
/* Flags allowed when running a command */ /* Flags allowed when running a command */
valid_flags = MODE_BACKGROUND|MODE_PRESERVE_ENV|MODE_RESET_HOME| valid_flags = MODE_BACKGROUND|MODE_PRESERVE_ENV|MODE_RESET_HOME|
MODE_LOGIN_SHELL|MODE_INVALIDATE|MODE_NONINTERACTIVE| MODE_LOGIN_SHELL|MODE_NONINTERACTIVE|
MODE_PRESERVE_GROUPS|MODE_SHELL; MODE_PRESERVE_GROUPS|MODE_SHELL;
/* XXX - should fill in settings at the end to avoid dupes */ /* XXX - should fill in settings at the end to avoid dupes */
for (;;) { for (;;) {
@@ -186,7 +186,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp,
if (mode && mode != MODE_EDIT) if (mode && mode != MODE_EDIT)
usage_excl(1); usage_excl(1);
mode = MODE_EDIT; mode = MODE_EDIT;
valid_flags = MODE_INVALIDATE|MODE_NONINTERACTIVE; valid_flags = MODE_NONINTERACTIVE;
break; break;
case 'g': case 'g':
runas_group = optarg; runas_group = optarg;
@@ -209,7 +209,6 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp,
break; break;
case 'k': case 'k':
sudo_settings[ARG_IGNORE_TICKET].value = "true"; sudo_settings[ARG_IGNORE_TICKET].value = "true";
SET(flags, MODE_INVALIDATE);
break; break;
case 'K': case 'K':
sudo_settings[ARG_IGNORE_TICKET].value = "true"; sudo_settings[ARG_IGNORE_TICKET].value = "true";
@@ -226,7 +225,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp,
usage_excl(1); usage_excl(1);
} }
mode = MODE_LIST; mode = MODE_LIST;
valid_flags = MODE_INVALIDATE|MODE_NONINTERACTIVE|MODE_LONG_LIST; valid_flags = MODE_NONINTERACTIVE|MODE_LONG_LIST;
break; break;
case 'n': case 'n':
SET(flags, MODE_NONINTERACTIVE); SET(flags, MODE_NONINTERACTIVE);
@@ -265,7 +264,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp,
if (mode && mode != MODE_VALIDATE) if (mode && mode != MODE_VALIDATE)
usage_excl(1); usage_excl(1);
mode = MODE_VALIDATE; mode = MODE_VALIDATE;
valid_flags = MODE_INVALIDATE|MODE_NONINTERACTIVE; valid_flags = MODE_NONINTERACTIVE;
break; break;
case 'V': case 'V':
if (mode && mode != MODE_VERSION) if (mode && mode != MODE_VERSION)
@@ -296,14 +295,15 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp,
if (!mode) { if (!mode) {
/* Defer -k mode setting until we know whether it is a flag or not */ /* Defer -k mode setting until we know whether it is a flag or not */
if (ISSET(flags, MODE_INVALIDATE) && *nargc == 0) { if (sudo_settings[ARG_IGNORE_TICKET].value != NULL) {
mode = MODE_INVALIDATE; /* -k by itself */ if (*nargc == 0) {
CLR(flags, MODE_INVALIDATE); mode = MODE_INVALIDATE; /* -k by itself */
sudo_settings[ARG_IGNORE_TICKET].value = NULL; sudo_settings[ARG_IGNORE_TICKET].value = NULL;
valid_flags = 0; valid_flags = 0;
} else { }
mode = MODE_RUN; /* running a command */
} }
if (!mode)
mode = MODE_RUN; /* running a command */
} }
if (*nargc > 0 && mode == MODE_LIST) if (*nargc > 0 && mode == MODE_LIST)