Fix git-fsck-objects SIGSEGV/divide-by-zero
authorLinus Torvalds <torvalds@osdl.org>
Mon, 4 Sep 2006 15:34:12 +0000 (08:34 -0700)
committerJunio C Hamano <junkio@cox.net>
Mon, 4 Sep 2006 22:24:10 +0000 (15:24 -0700)
commit5d44cd1c8b27fb677fedc886303d38b19fbb07f7
treec77ca9272226511f3730f168400aae621ddf7c71
parentf2e609473cb4aeb3884b7dd57a3a652df4e5edcf
Fix git-fsck-objects SIGSEGV/divide-by-zero

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>
object-refs.c