From 846d3b5874be9f5b808f8bf5ce2e1f07fe1293f0 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Wed, 28 Feb 2018 10:09:56 +0100 Subject: [PATCH] vshCommandOpt: Do more checking if skipChecks is set Currently if cmd->skipChecks is set (done only from completers) some basic checks are skipped because we're working over partially parsed command. See a26ff63ae4 for more detailed explanation. Anyway, the referenced commit was too aggressive in disabling checks and effectively returned success even in clear case of failure. For instance: # domif-getlink --interface causes virshDomainInterfaceCompleter() to be called, which calls virshDomainGetXML() which eventually calls vshCommandOptStringReq(.., name = "domain"); The --domain argument is required for the command and if not present -1 should be returned to tell the caller the argument was not found. Well, zero is returned meaning the argument was not found but it's not required either. Signed-off-by: Michal Privoznik --- tools/vsh.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/vsh.c b/tools/vsh.c index 37c292a03d..73ec007e56 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -817,18 +817,17 @@ vshCommandOpt(const vshCmd *cmd, const char *name, vshCmdOpt **opt, /* See if option is valid and/or required. */ *opt = NULL; - if (!cmd->skipChecks) { - while (valid && valid->name) { - if (STREQ(name, valid->name)) - break; - valid++; - } + while (valid && valid->name) { + if (STREQ(name, valid->name)) + break; + valid++; + } + if (!cmd->skipChecks) assert(valid && (!needData || valid->type != VSH_OT_BOOL)); - if (valid->flags & VSH_OFLAG_REQ) - ret = -1; - } + if (valid && valid->flags & VSH_OFLAG_REQ) + ret = -1; /* See if option is present on command line. */ while (candidate) { @@ -1065,7 +1064,8 @@ vshCommandOptStringReq(vshControl *ctl, error = N_("Option argument is empty"); if (error) { - vshError(ctl, _("Failed to get option '%s': %s"), name, _(error)); + if (!cmd->skipChecks) + vshError(ctl, _("Failed to get option '%s': %s"), name, _(error)); return -1; } -- GitLab