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
}