unpack_entry(): convert to new revindex API
Remove direct manipulation of the 'struct revindex_entry' type as well as calls to the deprecated API in 'packfile.c:unpack_entry()'. Usual clean-up is performed (replacing '->nr' with calls to 'pack_pos_to_index()' and so on). Add an additional check to make sure that 'obj_offset()' points at a valid object. In the case this check is violated, we cannot call 'mark_bad_packed_object()' because we don't know the OID. At the top of the call stack is do_oid_object_info_extended() (via packed_object_info()), which does mark the object. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Taylor Blau committed
Jan 13, 2021 at 17:24 UTC
0a7e3642bc0d42a2c322886e64872ac9d736fa84
1 file changed
+18
-8
packfile.c
+18
-8
@@ -1694,11 +1694,21 @@ void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset,
1694
}
1695
1696
if (do_check_packed_object_crc && p->index_version > 1) {
1697
- struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
1698
- off_t len = revidx[1].offset - obj_offset;
1699
- if (check_pack_crc(p, &w_curs, obj_offset, len, revidx->nr)) {
1697
+ uint32_t pack_pos, index_pos;
1698
+ off_t len;
1699
+
1700
+ if (offset_to_pack_pos(p, obj_offset, &pack_pos) < 0) {
1701
+ error("could not find object at offset %"PRIuMAX" in pack %s",
1702
+ (uintmax_t)obj_offset, p->pack_name);
1703
+ data = NULL;
1704
+ goto out;
1705
+ }
1706
+
1707
+ len = pack_pos_to_offset(p, pack_pos + 1) - obj_offset;
1708
+ index_pos = pack_pos_to_index(p, pack_pos);
1709
+ if (check_pack_crc(p, &w_curs, obj_offset, len, index_pos)) {
1710
struct object_id oid;
1701
- nth_packed_object_id(&oid, p, revidx->nr);
1711
+ nth_packed_object_id(&oid, p, index_pos);
1712
error("bad packed object CRC for %s",
1713
oid_to_hex(&oid));
1714
mark_bad_packed_object(p, oid.hash);
@@ -1781,11 +1791,11 @@ void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset,
1791
* This is costly but should happen only in the presence
1792
* of a corrupted pack, and is better than failing outright.
1793
*/
1784
- struct revindex_entry *revidx;
1794
+ uint32_t pos;
1795
struct object_id base_oid;
1786
- revidx = find_pack_revindex(p, obj_offset);
1787
- if (revidx) {
1788
- nth_packed_object_id(&base_oid, p, revidx->nr);
1796
+ if (!(offset_to_pack_pos(p, obj_offset, &pos))) {
1797
+ nth_packed_object_id(&base_oid, p,
1798
+ pack_pos_to_index(p, pos));
1799
error("failed to read delta base object %s"
1800
" at offset %"PRIuMAX" from %s",
1801
oid_to_hex(&base_oid), (uintmax_t)obj_offset,