[PATCH 04/10 v2] parse-options: sanity check PARSE_OPT_NOARG flag
From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:50:09
Subsystem:
the rest · Maintainer:
Linus Torvalds
Some option types cannot use an argument --- boolean options that would set a bit or flag or increment a counter, for example. If configured in the flag word to accept an argument anyway, the result is an argument that is advertised in "program -h" output only to be rejected by parse-options::get_value. Luckily all current users of these option types use PARSE_OPT_NOARG and do not use PARSE_OPT_OPTARG. Add a check to ensure that that remains true. The check is run once for each invocation of parse_option_start(). Improved-by: Stephen Boyd [off-list ref] Signed-off-by: Jonathan Nieder <redacted> --- Changes since v1: - adapt for updated patch 2/10 parse-options.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/parse-options.c b/parse-options.c
index 9f6d305..74ab0c8 100644
--- a/parse-options.c
+++ b/parse-options.c@@ -330,6 +330,19 @@ static void parse_options_check(const struct option *opts) opts->long_name)) err |= optbug(opts, "uses feature " "not supported for dashless options"); + switch (opts->type) { + case OPTION_BOOLEAN: + case OPTION_BIT: + case OPTION_NEGBIT: + case OPTION_SET_INT: + case OPTION_SET_PTR: + case OPTION_NUMBER: + if ((opts->flags & PARSE_OPT_OPTARG) || + !(opts->flags & PARSE_OPT_NOARG)) + err |= optbug(opts, "should not accept an argument"); + default: + ; /* ok. (usually accepts an argument) */ + } } if (err) exit(128);
--
1.7.2.3