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>
This commit is contained in:
David Sharp 2014-01-28 13:21:00 -08:00 коммит произвёл Junio C Hamano
Родитель d2446dfd7f
Коммит a43219f2aa
1 изменённых файлов: 11 добавлений и 6 удалений

Просмотреть файл

@ -523,15 +523,17 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
continue;
}
if (!strcmp(arg, "--default")) {
def = argv[i+1];
i++;
def = argv[++i];
if (!def)
die("--default requires an argument");
continue;
}
if (!strcmp(arg, "--prefix")) {
prefix = argv[i+1];
prefix = argv[++i];
if (!prefix)
die("--prefix requires an argument");
startup_info->prefix = prefix;
output_prefix = 1;
i++;
continue;
}
if (!strcmp(arg, "--revs-only")) {
@ -703,9 +705,12 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
continue;
}
if (!strcmp(arg, "--resolve-git-dir")) {
const char *gitdir = resolve_gitdir(argv[i+1]);
const char *gitdir = argv[++i];
if (!gitdir)
die("not a gitdir '%s'", argv[i+1]);
die("--resolve-git-dir requires an argument");
gitdir = resolve_gitdir(gitdir);
if (!gitdir)
die("not a gitdir '%s'", argv[i]);
puts(gitdir);
continue;
}