• Linus Torvalds's avatar
    Fix git-fsck-objects SIGSEGV/divide-by-zero · 5d44cd1c
    Linus Torvalds authored
    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: default avatarLinus Torvalds <[email protected]>
    Signed-off-by: default avatarJunio C Hamano <[email protected]>
    5d44cd1c
object-refs.c 3.04 KB