1
0
mirror of https://github.com/git/git synced 2024-07-05 00:58:49 +00:00

sha1_name: fix segfault caused by invalid index access

The code to see if user input "git show :path" makes sense tried to access
the index without properly checking the array bound.

Signed-off-by: Markus Heidelberg <markus.heidelberg@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Markus Heidelberg 2010-02-28 16:49:15 +01:00 committed by Junio C Hamano
parent 64da6e20de
commit 77e8466fb9

View File

@ -992,13 +992,15 @@ static void diagnose_invalid_index_path(int stage,
pos = cache_name_pos(filename, namelen); pos = cache_name_pos(filename, namelen);
if (pos < 0) if (pos < 0)
pos = -pos - 1; pos = -pos - 1;
ce = active_cache[pos]; if (pos < active_nr) {
if (ce_namelen(ce) == namelen && ce = active_cache[pos];
!memcmp(ce->name, filename, namelen)) if (ce_namelen(ce) == namelen &&
die("Path '%s' is in the index, but not at stage %d.\n" !memcmp(ce->name, filename, namelen))
"Did you mean ':%d:%s'?", die("Path '%s' is in the index, but not at stage %d.\n"
filename, stage, "Did you mean ':%d:%s'?",
ce_stage(ce), filename); filename, stage,
ce_stage(ce), filename);
}
/* Confusion between relative and absolute filenames? */ /* Confusion between relative and absolute filenames? */
fullnamelen = namelen + strlen(prefix); fullnamelen = namelen + strlen(prefix);
@ -1008,13 +1010,15 @@ static void diagnose_invalid_index_path(int stage,
pos = cache_name_pos(fullname, fullnamelen); pos = cache_name_pos(fullname, fullnamelen);
if (pos < 0) if (pos < 0)
pos = -pos - 1; pos = -pos - 1;
ce = active_cache[pos]; if (pos < active_nr) {
if (ce_namelen(ce) == fullnamelen && ce = active_cache[pos];
!memcmp(ce->name, fullname, fullnamelen)) if (ce_namelen(ce) == fullnamelen &&
die("Path '%s' is in the index, but not '%s'.\n" !memcmp(ce->name, fullname, fullnamelen))
"Did you mean ':%d:%s'?", die("Path '%s' is in the index, but not '%s'.\n"
fullname, filename, "Did you mean ':%d:%s'?",
ce_stage(ce), fullname); fullname, filename,
ce_stage(ce), fullname);
}
if (!lstat(filename, &st)) if (!lstat(filename, &st))
die("Path '%s' exists on disk, but not in the index.", filename); die("Path '%s' exists on disk, but not in the index.", filename);