rev-parse: check i before using argv[i] against argc

The --prefix, --default, and --resolve-git-dir options to git-rev-parse require an argument, but when given no argument, the code uses the NULL read from argv[argc] without checking, leading to a segfault. Instead, check first and die() with an error message. Signed-off-by: David Sharp <dhsharp@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

David Sharp committed Jan 28, 2014 at 13:21 UTC a43219f2aaa39fbc53ba0aee2481e1cca3c0e649
1 file changed +11 -6
builtin/rev-parse.c
+11 -6
@@ -523,15 +523,17 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
523 continue;
524 }
525 if (!strcmp(arg, "--default")) {
526 - def = argv[i+1];
527 - i++;
526 + def = argv[++i];
527 + if (!def)
528 + die("--default requires an argument");
529 continue;
530 }
531 if (!strcmp(arg, "--prefix")) {
531 - prefix = argv[i+1];
532 + prefix = argv[++i];
533 + if (!prefix)
534 + die("--prefix requires an argument");
535 startup_info->prefix = prefix;
536 output_prefix = 1;
534 - i++;
537 continue;
538 }
539 if (!strcmp(arg, "--revs-only")) {
@@ -703,9 +705,12 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
705 continue;
706 }
707 if (!strcmp(arg, "--resolve-git-dir")) {
706 - const char *gitdir = resolve_gitdir(argv[i+1]);
708 + const char *gitdir = argv[++i];
709 if (!gitdir)
708 - die("not a gitdir '%s'", argv[i+1]);
710 + die("--resolve-git-dir requires an argument");
711 + gitdir = resolve_gitdir(gitdir);
712 + if (!gitdir)
713 + die("not a gitdir '%s'", argv[i]);
714 puts(gitdir);
715 continue;
716 }