revision.c: stricter parsing of '--early-output'
The parsing of '--early-output' with or without its optional integer argument allowed bogus options like '--early-output-foobarbaz' to slip through and be ignored. Fix it by parsing '--early-output' in the same way as other options with an optional argument are parsed. Furthermore, use strtoul_ui() to parse the optional integer argument and to refuse negative numbers. While at it, use skip_prefix() instead of starts_with() and magic numbers. Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com> Reviewed-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
SZEDER Gábor committed
Jun 9, 2017 at 20:17 UTC
dffc651ed191ff0eb3cfd0e8df83a423b4dae994
1 file changed
+7
-10
revision.c
+7
-10
@@ -1750,16 +1750,13 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
1750
} else if (!strcmp(arg, "--author-date-order")) {
1751
revs->sort_order = REV_SORT_BY_AUTHOR_DATE;
1752
revs->topo_order = 1;
1753
- } else if (starts_with(arg, "--early-output")) {
1754
- int count = 100;
1755
- switch (arg[14]) {
1756
- case '=':
1757
- count = atoi(arg+15);
1758
- /* Fallthrough */
1759
- case 0:
1760
- revs->topo_order = 1;
1761
- revs->early_output = count;
1762
- }
1753
+ } else if (!strcmp(arg, "--early-output")) {
1754
+ revs->early_output = 100;
1755
+ revs->topo_order = 1;
1756
+ } else if (skip_prefix(arg, "--early-output=", &optarg)) {
1757
+ if (strtoul_ui(optarg, 10, &revs->early_output) < 0)
1758
+ die("'%s': not a non-negative integer", optarg);
1759
+ revs->topo_order = 1;
1760
} else if (!strcmp(arg, "--parents")) {
1761
revs->rewrite_parents = 1;
1762
revs->print_parents = 1;