summaryrefslogtreecommitdiff
path: root/unpack-trees.c
diff options
context:
space:
mode:
authorClemens Buchacher <drizzd@aon.at>2009-01-01 20:54:32 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-01-05 20:46:35 (GMT)
commit837e5fe95d9d6e597b748d338e45cca231f558fa (patch)
tree63509e66387ffc9a7a743ff69133fe17285ecefc /unpack-trees.c
parent6b9315d5a14b4d1389cff347fcfcb86624bbf645 (diff)
downloadgit-837e5fe95d9d6e597b748d338e45cca231f558fa.zip
git-837e5fe95d9d6e597b748d338e45cca231f558fa.tar.gz
git-837e5fe95d9d6e597b748d338e45cca231f558fa.tar.bz2
unpack-trees: fix path search bug in verify_absent
Commit 0cf73755 (unpack-trees.c: assume submodules are clean during check-out) changed an argument to verify_absent from 'path' to 'ce', which is however shadowed by a local variable of the same name. The bug triggers if verify_absent is used on a tree entry, for which the index contains one or more subsequent directories of the same length. The affected subdirectories are removed from the index. The testcase included in this commit bisects to 55218834 (checkout: do not lose staged removal), which reveals the bug in this case, but is otherwise unrelated. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'unpack-trees.c')
-rw-r--r--unpack-trees.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/unpack-trees.c b/unpack-trees.c
index 3f42c29..48e538a 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -516,22 +516,22 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action,
namelen = strlen(ce->name);
pos = index_name_pos(o->src_index, ce->name, namelen);
if (0 <= pos)
- return cnt; /* we have it as nondirectory */
+ return 0; /* we have it as nondirectory */
pos = -pos - 1;
for (i = pos; i < o->src_index->cache_nr; i++) {
- struct cache_entry *ce = o->src_index->cache[i];
- int len = ce_namelen(ce);
+ struct cache_entry *ce2 = o->src_index->cache[i];
+ int len = ce_namelen(ce2);
if (len < namelen ||
- strncmp(ce->name, ce->name, namelen) ||
- ce->name[namelen] != '/')
+ strncmp(ce->name, ce2->name, namelen) ||
+ ce2->name[namelen] != '/')
break;
/*
- * ce->name is an entry in the subdirectory.
+ * ce2->name is an entry in the subdirectory.
*/
- if (!ce_stage(ce)) {
- if (verify_uptodate(ce, o))
+ if (!ce_stage(ce2)) {
+ if (verify_uptodate(ce2, o))
return -1;
- add_entry(o, ce, CE_REMOVE, 0);
+ add_entry(o, ce2, CE_REMOVE, 0);
}
cnt++;
}
@@ -623,7 +623,7 @@ static int verify_absent(struct cache_entry *ce, const char *action,
* If this removed entries from the index,
* what that means is:
*
- * (1) the caller unpack_trees_rec() saw path/foo
+ * (1) the caller unpack_callback() saw path/foo
* in the index, and it has not removed it because
* it thinks it is handling 'path' as blob with
* D/F conflict;