Merge branch 'jk/index-pack-dupfix' into maint

The index-pack code now diagnoses a bad input packstream that
records the same object twice when it is used as delta base; the
code used to declare a software bug when encountering such an
input, but it is an input error.

* jk/index-pack-dupfix:
  index-pack: downgrade twice-resolved REF_DELTA to die()
This commit is contained in:
Junio C Hamano 2020-03-17 15:02:21 -07:00
commit 7e84f4608f
2 changed files with 7 additions and 5 deletions

View File

@ -1003,7 +1003,9 @@ static struct base_data *find_unresolved_deltas_1(struct base_data *base,
if (!compare_and_swap_type(&child->real_type, OBJ_REF_DELTA, if (!compare_and_swap_type(&child->real_type, OBJ_REF_DELTA,
base->obj->real_type)) base->obj->real_type))
BUG("child->real_type != OBJ_REF_DELTA"); die("REF_DELTA at offset %"PRIuMAX" already resolved (duplicate base %s?)",
(uintmax_t)child->idx.offset,
oid_to_hex(&base->obj->idx.oid));
resolve_delta(child, base, result); resolve_delta(child, base, result);
if (base->ref_first == base->ref_last && base->ofs_last == -1) if (base->ref_first == base->ref_last && base->ofs_last == -1)

View File

@ -62,13 +62,13 @@ test_expect_success 'index-pack detects REF_DELTA cycles' '
test_must_fail git index-pack --fix-thin --stdin <cycle.pack test_must_fail git index-pack --fix-thin --stdin <cycle.pack
' '
test_expect_failure 'failover to an object in another pack' ' test_expect_success 'failover to an object in another pack' '
clear_packs && clear_packs &&
git index-pack --stdin <ab.pack && git index-pack --stdin <ab.pack &&
git index-pack --stdin --fix-thin <cycle.pack test_must_fail git index-pack --stdin --fix-thin <cycle.pack
' '
test_expect_failure 'failover to a duplicate object in the same pack' ' test_expect_success 'failover to a duplicate object in the same pack' '
clear_packs && clear_packs &&
{ {
pack_header 3 && pack_header 3 &&
@ -77,7 +77,7 @@ test_expect_failure 'failover to a duplicate object in the same pack' '
pack_obj $A pack_obj $A
} >recoverable.pack && } >recoverable.pack &&
pack_trailer recoverable.pack && pack_trailer recoverable.pack &&
git index-pack --fix-thin --stdin <recoverable.pack test_must_fail git index-pack --fix-thin --stdin <recoverable.pack
' '
test_done test_done