Commit 25082d1e authored by Wayne Davison's avatar Wayne Davison

Reject passing an arg to an option that doesn't take one (bug 6915).

Based on a patch by Matt, but further tweaked to deal with -q=foo.

Ultimately this should be upstreamed, but for now lets get this
functionality into rsync.
parent 5deb19e4
...@@ -860,20 +860,21 @@ int poptGetNextOpt(poptContext con) ...@@ -860,20 +860,21 @@ int poptGetNextOpt(poptContext con)
origOptString++; origOptString++;
if (*origOptString != '\0') if (*origOptString != '\0')
con->os->nextCharArg = origOptString + (*origOptString == '='); con->os->nextCharArg = origOptString;
} }
/*@=branchstate@*/ /*@=branchstate@*/
if (opt == NULL) return POPT_ERROR_BADOPT; /* XXX can't happen */ if (opt == NULL) return POPT_ERROR_BADOPT; /* XXX can't happen */
if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) { if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE
if (poptSaveInt((int *)opt->arg, opt->argInfo, 1L)) || (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_VAL) {
return POPT_ERROR_BADOPERATION; if (longArg || (con->os->nextCharArg && con->os->nextCharArg[0] == '='))
} else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_VAL) { return POPT_ERROR_UNWANTEDARG;
if (opt->arg) { if (opt->arg) {
if (poptSaveInt((int *)opt->arg, opt->argInfo, (long)opt->val)) long val = (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_VAL ? opt->val : 1;
if (poptSaveInt((int *)opt->arg, opt->argInfo, val))
return POPT_ERROR_BADOPERATION; return POPT_ERROR_BADOPERATION;
} }
} else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) { } else {
con->os->nextArg = _free(con->os->nextArg); con->os->nextArg = _free(con->os->nextArg);
/*@-usedef@*/ /* FIX: W2DO? */ /*@-usedef@*/ /* FIX: W2DO? */
if (longArg) { if (longArg) {
...@@ -881,7 +882,7 @@ int poptGetNextOpt(poptContext con) ...@@ -881,7 +882,7 @@ int poptGetNextOpt(poptContext con)
longArg = expandNextArg(con, longArg); longArg = expandNextArg(con, longArg);
con->os->nextArg = longArg; con->os->nextArg = longArg;
} else if (con->os->nextCharArg) { } else if (con->os->nextCharArg) {
longArg = expandNextArg(con, con->os->nextCharArg); longArg = expandNextArg(con, con->os->nextCharArg + (con->os->nextCharArg[0] == '='));
con->os->nextArg = longArg; con->os->nextArg = longArg;
con->os->nextCharArg = NULL; con->os->nextCharArg = NULL;
} else { } else {
...@@ -1202,6 +1203,8 @@ const char * poptStrerror(const int error) ...@@ -1202,6 +1203,8 @@ const char * poptStrerror(const int error)
switch (error) { switch (error) {
case POPT_ERROR_NOARG: case POPT_ERROR_NOARG:
return POPT_("missing argument"); return POPT_("missing argument");
case POPT_ERROR_UNWANTEDARG:
return POPT_("option does not take an argument");
case POPT_ERROR_BADOPT: case POPT_ERROR_BADOPT:
return POPT_("unknown option"); return POPT_("unknown option");
case POPT_ERROR_BADOPERATION: case POPT_ERROR_BADOPERATION:
......
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
/*@{*/ /*@{*/
#define POPT_ERROR_NOARG -10 /*!< missing argument */ #define POPT_ERROR_NOARG -10 /*!< missing argument */
#define POPT_ERROR_BADOPT -11 /*!< unknown option */ #define POPT_ERROR_BADOPT -11 /*!< unknown option */
#define POPT_ERROR_UNWANTEDARG -12 /*!< option does not take an argument */
#define POPT_ERROR_OPTSTOODEEP -13 /*!< aliases nested too deeply */ #define POPT_ERROR_OPTSTOODEEP -13 /*!< aliases nested too deeply */
#define POPT_ERROR_BADQUOTE -15 /*!< error in paramter quoting */ #define POPT_ERROR_BADQUOTE -15 /*!< error in paramter quoting */
#define POPT_ERROR_ERRNO -16 /*!< errno set, use strerror(errno) */ #define POPT_ERROR_ERRNO -16 /*!< errno set, use strerror(errno) */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment