From: Patrick Steinhardt Date: Thu, 18 Dec 2025 10:54:13 GMT Subject: [PATCH v2 1/7] object-file: always set OI_LOOSE when reading object info Message-ID: <20251218-b4-pks-odb-read-object-info-improvements-v2-1-62e3e49072bc@pks.im> In-Reply-To: <20251218-b4-pks-odb-read-object-info-improvements-v2-0-62e3e49072bc@pks.im> There are some early returns in ``odb_source_loose_read_object_info()` in cases where we don't have to open the loose object. These return paths do not set `struct object_info::whence` to `OI_LOOSE` though, so it becomes impossible for the caller to tell the format of such an object. Nobody seems to care about this right now, but it's a bug waiting to happen. Fix this by always setting `whence` on success. Signed-off-by: Patrick Steinhardt --- object-file.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/object-file.c b/object-file.c index 6280e42f34..d566df427a 100644 --- a/object-file.c +++ b/object-file.c @@ -439,12 +439,23 @@ int odb_source_loose_read_object_info(struct odb_source *source, */ if (!oi || (!oi->typep && !oi->sizep && !oi->contentp)) { struct stat st; - if ((!oi || !oi->disk_sizep) && (flags & OBJECT_INFO_QUICK)) - return quick_has_loose(source->loose, oid) ? 0 : -1; + + if ((!oi || !oi->disk_sizep) && (flags & OBJECT_INFO_QUICK)) { + status = quick_has_loose(source->loose, oid) ? 0 : -1; + if (!status && oi) + oi->whence = OI_LOOSE; + return status; + } + if (stat_loose_object(source->loose, oid, &st, &path) < 0) return -1; - if (oi && oi->disk_sizep) - *oi->disk_sizep = st.st_size; + + if (oi) { + if (oi->disk_sizep) + *oi->disk_sizep = st.st_size; + oi->whence = OI_LOOSE; + } + return 0; } -- 2.52.0.351.gbe84eed79e.dirty