aboutsummaryrefslogtreecommitdiff
path: root/packfile.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2026-03-05 10:04:49 -0800
committerJunio C Hamano <gitster@pobox.com>2026-03-05 10:04:49 -0800
commitd93be9cbcaf80f4d1ff56a3d7aa5d722236b6eac (patch)
tree2febbd0e230148934704a2eebe27fcd7d58780c4 /packfile.c
parentdb227bce2224b55b11954a5f292a0b035b7d9279 (diff)
parent13eb65d36615d7269df053015bddf7987ef6d923 (diff)
downloadgit-d93be9cbcaf80f4d1ff56a3d7aa5d722236b6eac.tar.xz
Merge branch 'ps/fsck-stream-from-the-right-object-instance'
"fsck" iterates over packfiles and its access to pack data caused the list to be permuted, which caused it to loop forever; the code to access pack data by "fsck" has been updated to avoid this. * ps/fsck-stream-from-the-right-object-instance: pack-check: fix verification of large objects packfile: expose function to read object stream for an offset object-file: adapt `stream_object_signature()` to take a stream t/helper: improve "genrandom" test helper
Diffstat (limited to 'packfile.c')
-rw-r--r--packfile.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/packfile.c b/packfile.c
index ce837f852a..4a6d4a80ea 100644
--- a/packfile.c
+++ b/packfile.c
@@ -2621,32 +2621,28 @@ static int close_istream_pack_non_delta(struct odb_read_stream *_st)
return 0;
}
-int packfile_store_read_object_stream(struct odb_read_stream **out,
- struct packfile_store *store,
- const struct object_id *oid)
+int packfile_read_object_stream(struct odb_read_stream **out,
+ const struct object_id *oid,
+ struct packed_git *pack,
+ off_t offset)
{
struct odb_packed_read_stream *stream;
struct pack_window *window = NULL;
- struct object_info oi = OBJECT_INFO_INIT;
enum object_type in_pack_type;
unsigned long size;
- oi.sizep = &size;
+ in_pack_type = unpack_object_header(pack, &window, &offset, &size);
+ unuse_pack(&window);
- if (packfile_store_read_object_info(store, oid, &oi, 0) ||
- oi.u.packed.type == PACKED_OBJECT_TYPE_REF_DELTA ||
- oi.u.packed.type == PACKED_OBJECT_TYPE_OFS_DELTA ||
- repo_settings_get_big_file_threshold(store->source->odb->repo) >= size)
+ if (repo_settings_get_big_file_threshold(pack->repo) >= size)
return -1;
- in_pack_type = unpack_object_header(oi.u.packed.pack,
- &window,
- &oi.u.packed.offset,
- &size);
- unuse_pack(&window);
switch (in_pack_type) {
default:
return -1; /* we do not do deltas for now */
+ case OBJ_BAD:
+ mark_bad_packed_object(pack, oid);
+ return -1;
case OBJ_COMMIT:
case OBJ_TREE:
case OBJ_BLOB:
@@ -2660,10 +2656,22 @@ int packfile_store_read_object_stream(struct odb_read_stream **out,
stream->base.type = in_pack_type;
stream->base.size = size;
stream->z_state = ODB_PACKED_READ_STREAM_UNINITIALIZED;
- stream->pack = oi.u.packed.pack;
- stream->pos = oi.u.packed.offset;
+ stream->pack = pack;
+ stream->pos = offset;
*out = &stream->base;
return 0;
}
+
+int packfile_store_read_object_stream(struct odb_read_stream **out,
+ struct packfile_store *store,
+ const struct object_id *oid)
+{
+ struct pack_entry e;
+
+ if (!find_pack_entry(store, oid, &e))
+ return -1;
+
+ return packfile_read_object_stream(out, oid, e.p, e.offset);
+}