From 79104ce7517de802d6cd7aeda2bc94e0e9d6c060 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Wed, 14 Aug 2013 13:41:47 -0600 Subject: [PATCH] Fix parsing of "-h host" when used in conjunction with the -l flag. --- src/parse_args.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/parse_args.c b/src/parse_args.c index 4a8164d72..ee8bbd796 100644 --- a/src/parse_args.c +++ b/src/parse_args.c @@ -210,7 +210,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, sudo_settings[ARG_MAX_GROUPS].value = cp; } - /* Returns true if the last option string was "--" */ + /* Returns true if the last option string was "-h" */ #define got_host_flag (optind > 1 && argv[optind - 1][0] == '-' && \ argv[optind - 1][1] == 'h' && argv[optind - 1][2] == '\0') @@ -275,6 +275,16 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, break; case 'h': if (optarg == NULL) { + /* + * Optional args support -hhostname, not -h hostname. + * If we see a non-option after the -h flag, treat as + * remote host and bump optind to skip over it. + */ + if (got_host_flag && !is_envar && + argv[optind] != NULL && argv[optind][0] != '-') { + sudo_settings[ARG_REMOTE_HOST].value = argv[optind++]; + continue; + } if (mode && mode != MODE_HELP) { if (strcmp(getprogname(), "sudoedit") != 0) usage_excl(1); @@ -358,18 +368,6 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, default: usage(1); } - } else if (got_host_flag && optind < argc) { - /* - * Optional args only support -hhostname, not -h hostname. - * If we see a non-option after the -h flag, treat as - * remote host, clear help mode and reset valid_flags. - */ - mode = 0; - valid_flags = DEFAULT_VALID_FLAGS; - sudo_settings[ARG_REMOTE_HOST].value = argv[optind]; - - /* Crank optind and resume getopt. */ - optind++; } else if (!got_end_of_args && is_envar) { if (nenv == env_size - 2) { env_size *= 2;