summaryrefslogtreecommitdiff
path: root/packfile.c
diff options
context:
space:
mode:
authorTaylor Blau <me@ttaylorr.com>2021-01-13 22:24:41 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-01-14 05:53:47 (GMT)
commitfc150caf67d91b0eeba359d63b4ce707aba8b5ca (patch)
tree05488f25c7af945aa805116cb7fc166670404eba /packfile.c
parent3a3f54dd0a70c2b6e8342b156d13e0bd941be07b (diff)
downloadgit-fc150caf67d91b0eeba359d63b4ce707aba8b5ca.zip
git-fc150caf67d91b0eeba359d63b4ce707aba8b5ca.tar.gz
git-fc150caf67d91b0eeba359d63b4ce707aba8b5ca.tar.bz2
packed_object_info(): convert to new revindex API
Convert another call of 'find_pack_revindex()' to its replacement 'pack_pos_to_offset()'. Likewise: - Avoid manipulating `struct packed_git`'s `revindex` pointer directly by removing the pointer-as-array indexing. - Add an additional guard to check that the offset 'obj_offset()' points to a real object. This should be the case with well-behaved callers to 'packed_object_info()', but isn't guarenteed. Other blocks that fill in various other values from the 'struct object_info' request handle bad inputs by setting the type to 'OBJ_BAD' and jumping to 'out'. Do the same when given a bad offset here. The previous code would have segfaulted when given a bad 'obj_offset' value, since 'find_pack_revindex()' would return 'NULL', and then the line that fills 'oi->disk_sizep' would try to access 'NULL[1]' with a stride of 16 bytes (the width of 'struct revindex_entry)'. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'packfile.c')
-rw-r--r--packfile.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/packfile.c b/packfile.c
index 7c37f9e..bb4bb14 100644
--- a/packfile.c
+++ b/packfile.c
@@ -1537,8 +1537,15 @@ int packed_object_info(struct repository *r, struct packed_git *p,
}
if (oi->disk_sizep) {
- struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
- *oi->disk_sizep = revidx[1].offset - obj_offset;
+ uint32_t pos;
+ if (offset_to_pack_pos(p, obj_offset, &pos) < 0) {
+ error("could not find object at offset %"PRIuMAX" "
+ "in pack %s", (uintmax_t)obj_offset, p->pack_name);
+ type = OBJ_BAD;
+ goto out;
+ }
+
+ *oi->disk_sizep = pack_pos_to_offset(p, pos + 1) - obj_offset;
}
if (oi->typep || oi->type_name) {