mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
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>
This commit is contained in:
parent
f2e609473c
commit
5d44cd1c8b
|
@ -55,9 +55,13 @@ static void add_object_refs(struct object *obj, struct object_refs *ref)
|
||||||
|
|
||||||
struct object_refs *lookup_object_refs(struct object *obj)
|
struct object_refs *lookup_object_refs(struct object *obj)
|
||||||
{
|
{
|
||||||
int j = hash_obj(obj, refs_hash_size);
|
|
||||||
struct object_refs *ref;
|
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) {
|
while ((ref = refs_hash[j]) != NULL) {
|
||||||
if (ref->base == obj)
|
if (ref->base == obj)
|
||||||
break;
|
break;
|
||||||
|
@ -125,9 +129,6 @@ void mark_reachable(struct object *obj, unsigned int mask)
|
||||||
|
|
||||||
if (!track_object_refs)
|
if (!track_object_refs)
|
||||||
die("cannot do reachability with object refs turned off");
|
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 we've been here already, don't bother */
|
||||||
if (obj->flags & mask)
|
if (obj->flags & mask)
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in a new issue