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,