write_reuse_object(): convert to new revindex API

First replace 'find_pack_revindex()' with its replacement 'offset_to_pack_pos()'. This prevents any bogus OFS_DELTA that may make its way through until 'write_reuse_object()' from causing a bad memory read (if 'revidx' is 'NULL') Next, replace a direct access of '->nr' with the wrapper function 'pack_pos_to_index()'. 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:23 UTC 952fc6870d9594b364cf755e8419843b3049d98c
1 file changed +9 -4
builtin/pack-objects.c
+9 -4
@@ -419,7 +419,7 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
419 {
420 struct packed_git *p = IN_PACK(entry);
421 struct pack_window *w_curs = NULL;
422 - struct revindex_entry *revidx;
422 + uint32_t pos;
423 off_t offset;
424 enum object_type type = oe_type(entry);
425 off_t datalen;
@@ -436,10 +436,15 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
436 type, entry_size);
437
438 offset = entry->in_pack_offset;
439 - revidx = find_pack_revindex(p, offset);
440 - datalen = revidx[1].offset - offset;
439 + if (offset_to_pack_pos(p, offset, &pos) < 0)
440 + die(_("write_reuse_object: could not locate %s, expected at "
441 + "offset %"PRIuMAX" in pack %s"),
442 + oid_to_hex(&entry->idx.oid), (uintmax_t)offset,
443 + p->pack_name);
444 + datalen = pack_pos_to_offset(p, pos + 1) - offset;
445 if (!pack_to_stdout && p->index_version > 1 &&
442 - check_pack_crc(p, &w_curs, offset, datalen, revidx->nr)) {
446 + check_pack_crc(p, &w_curs, offset, datalen,
447 + pack_pos_to_index(p, pos))) {
448 error(_("bad packed object CRC for %s"),
449 oid_to_hex(&entry->idx.oid));
450 unuse_pack(&w_curs);