[PATCH 6/6] fsck: check HAS_OBJ more consistently
- From
Jeff King <peff@peff.net>
- Date
- Jan 16, 2017, 21:34 UTC
- Message-ID
- <20170116213457.n7twsvr2vozdpgcj@sigill.intra.peff.net>
- In-Reply-To
- <20170116212231.ojoqzlajpszifaf3@sigill.intra.peff.net>
There are two spots that call lookup_object() and assume that a non-NULL result means we have the object:
1. When we're checking the objects given to us by the user
on the command line.2. When we're checking if a reflog entry is valid.
This generally follows fsck's mental model that we will have looked at and loaded a "struct object" for each object in the repository. But it misses one case: if another object _mentioned_ an object, but we didn't actually parse it or verify that it exists, it will still have a struct.
It's not clear if this is a triggerable bug or not. Certainly the later parts of the reachability check need to be careful of this, and do so by checking the HAS_OBJ flag. But both of these steps happen before we start traversing, so probably we won't have followed any links yet. Still, it's easy enough to be defensive here.
Signed-off-by: Jeff King <peff@peff.net> --- builtin/fsck.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/builtin/fsck.c b/builtin/fsck.c index 8ae065b2d..28d3cbb14 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -398,7 +398,7 @@ static void fsck_handle_reflog_sha1(const char *refname, unsigned char *sha1, if (!is_null_sha1(sha1)) { obj = lookup_object(sha1); - if (obj) { + if (obj && (obj->flags & HAS_OBJ)) { if (timestamp && name_objects) add_decoration(fsck_walk_options.object_names, obj, @@ -755,7 +755,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) if (!get_sha1(arg, sha1)) { struct object *obj = lookup_object(sha1); - if (!obj) { + if (!obj || !(obj->flags & HAS_OBJ)) { error("%s: object missing", sha1_to_hex(sha1)); errors_found |= ERROR_OBJECT; continue;
-- 2.11.0.642.gd6f8cda6c