]> git.ipfire.org Git - thirdparty/git.git/commitdiff
unpack_entry(): convert to new revindex API
authorTaylor Blau <me@ttaylorr.com>
Wed, 13 Jan 2021 22:24:45 +0000 (17:24 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 14 Jan 2021 05:53:47 +0000 (21:53 -0800)
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>
packfile.c

index bb4bb146712d4f7eb0fb9e30b0ff933b1659f749..936ab3def53a3af1a0f42944874de483ef8f6601 100644 (file)
@@ -1694,11 +1694,21 @@ void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset,
                }
 
                if (do_check_packed_object_crc && p->index_version > 1) {
-                       struct revindex_entry *revidx = find_pack_revindex(p, obj_offset);
-                       off_t len = revidx[1].offset - obj_offset;
-                       if (check_pack_crc(p, &w_curs, obj_offset, len, revidx->nr)) {
+                       uint32_t pack_pos, index_pos;
+                       off_t len;
+
+                       if (offset_to_pack_pos(p, obj_offset, &pack_pos) < 0) {
+                               error("could not find object at offset %"PRIuMAX" in pack %s",
+                                     (uintmax_t)obj_offset, p->pack_name);
+                               data = NULL;
+                               goto out;
+                       }
+
+                       len = pack_pos_to_offset(p, pack_pos + 1) - obj_offset;
+                       index_pos = pack_pos_to_index(p, pack_pos);
+                       if (check_pack_crc(p, &w_curs, obj_offset, len, index_pos)) {
                                struct object_id oid;
-                               nth_packed_object_id(&oid, p, revidx->nr);
+                               nth_packed_object_id(&oid, p, index_pos);
                                error("bad packed object CRC for %s",
                                      oid_to_hex(&oid));
                                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,
                         * This is costly but should happen only in the presence
                         * of a corrupted pack, and is better than failing outright.
                         */
-                       struct revindex_entry *revidx;
+                       uint32_t pos;
                        struct object_id base_oid;
-                       revidx = find_pack_revindex(p, obj_offset);
-                       if (revidx) {
-                               nth_packed_object_id(&base_oid, p, revidx->nr);
+                       if (!(offset_to_pack_pos(p, obj_offset, &pos))) {
+                               nth_packed_object_id(&base_oid, p,
+                                                    pack_pos_to_index(p, pos));
                                error("failed to read delta base object %s"
                                      " at offset %"PRIuMAX" from %s",
                                      oid_to_hex(&base_oid), (uintmax_t)obj_offset,