summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f2e6094)
raw | patch | inline | side by side (parent: f2e6094)
author | Linus Torvalds <torvalds@osdl.org> | |
Mon, 4 Sep 2006 15:34:12 +0000 (08:34 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Mon, 4 Sep 2006 22:24:10 +0000 (15:24 -0700) |
If you try to fsck a repository that isn't entirely empty, but that has no
inter-object references (ie all the objects are blobs, and don't refer to
anything else), git-fsck-objects currently fails.
This probably cannot happen in practice, but can be tested with something
like
git init-db
touch dummy
git add dummy
git fsck-objects
where the fsck will die by a divide-by-zero when it tries to look up the
references from the one object it found (hash_obj() will do a modulus by
refs_hash_size).
On some other archiectures (ppc, sparc) the divide-by-zero will go
unnoticed, and we'll instead SIGSEGV when we hit the "refs_hash[j]"
access.
So move the test that should protect against this from mark_reachable()
into lookup_object_refs(), which incidentally in the process also fixes
mark_reachable() itself (it used to not mark the one object that _was_
reachable, because it decided that it had no refs too early).
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
inter-object references (ie all the objects are blobs, and don't refer to
anything else), git-fsck-objects currently fails.
This probably cannot happen in practice, but can be tested with something
like
git init-db
touch dummy
git add dummy
git fsck-objects
where the fsck will die by a divide-by-zero when it tries to look up the
references from the one object it found (hash_obj() will do a modulus by
refs_hash_size).
On some other archiectures (ppc, sparc) the divide-by-zero will go
unnoticed, and we'll instead SIGSEGV when we hit the "refs_hash[j]"
access.
So move the test that should protect against this from mark_reachable()
into lookup_object_refs(), which incidentally in the process also fixes
mark_reachable() itself (it used to not mark the one object that _was_
reachable, because it decided that it had no refs too early).
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
object-refs.c | patch | blob | history |
diff --git a/object-refs.c b/object-refs.c
index b0034e4b217e12b267a51301c52b75e7255aec7b..98ea10005a851c3879c6e65929e3e34068dc9e8b 100644 (file)
--- a/object-refs.c
+++ b/object-refs.c
struct object_refs *lookup_object_refs(struct object *obj)
{
- int j = hash_obj(obj, refs_hash_size);
struct object_refs *ref;
+ int j;
+ /* nothing to lookup */
+ if (!refs_hash_size)
+ return NULL;
+ j = hash_obj(obj, refs_hash_size);
while ((ref = refs_hash[j]) != NULL) {
if (ref->base == obj)
break;
if (!track_object_refs)
die("cannot do reachability with object refs turned off");
- /* nothing to lookup */
- if (!refs_hash_size)
- return;
/* If we've been here already, don't bother */
if (obj->flags & mask)
return;