]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/fsck: fix flags passed to `odb_has_object()`
authorPatrick Steinhardt <ps@pks.im>
Thu, 12 Feb 2026 06:59:38 +0000 (07:59 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 12 Feb 2026 19:05:08 +0000 (11:05 -0800)
In `mark_object()` we invoke `has_object()` with a value of 1. This is
somewhat fishy given that the function expects a bitset of flags, so any
behaviour that this results in is purely coincidental and may break at
any point in time.

The call to `has_object()` was originally introduced in 9eb86f41de
(fsck: do not lazy fetch known non-promisor object, 2020-08-05). The
intent here was to skip lazy fetches of promisor objects: we have
already verified that the object is not a promisor object, so if the
object is missing it indicates a corrupt repository.

The hardcoded value that we pass maps to `HAS_OBJECT_RECHECK_PACKED`,
which is probably the intended behaviour: `odb_has_object()` will not
fetch promisor objects unless `HAS_OBJECT_FETCH_PROMISOR` is passed, but
we may want to verify that no concurrent process has written the object
that we're trying to read.

Convert the code to use the named flag instead of the the hardcoded
value.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fsck.c

index 0512f78a87fe1da9ceb8786da89d94a3e17df72e..1d059dd6c22e3118256754b94ca8796c6749a2c7 100644 (file)
@@ -162,7 +162,8 @@ static int mark_object(struct object *obj, enum object_type type,
                return 0;
 
        if (!(obj->flags & HAS_OBJ)) {
-               if (parent && !odb_has_object(the_repository->objects, &obj->oid, 1)) {
+               if (parent && !odb_has_object(the_repository->objects, &obj->oid,
+                                             HAS_OBJECT_RECHECK_PACKED)) {
                        printf_ln(_("broken link from %7s %s\n"
                                    "              to %7s %s"),
                                  printable_type(&parent->oid, parent->type),