diff options
| author | Junio C Hamano <gitster@pobox.com> | 2020-02-14 12:54:24 -0800 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2020-02-14 12:54:24 -0800 |
| commit | 7b029ebaefd945b2315281fcdf9c35843641623b (patch) | |
| tree | 4c8ac3dbc5ab714f6481773faa5d553cbf3577d6 | |
| parent | aa21cc97bd10ab0b62f6d951ff2ff725261e326e (diff) | |
| parent | a21781011f80c9fcb31e84c7a164611491d8c663 (diff) | |
| download | git-7b029ebaefd945b2315281fcdf9c35843641623b.tar.gz | |
Merge branch 'jk/index-pack-dupfix'
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()
| -rw-r--r-- | builtin/index-pack.c | 4 | ||||
| -rwxr-xr-x | t/t5309-pack-delta-cycles.sh | 8 |
2 files changed, 7 insertions, 5 deletions
diff --git a/builtin/index-pack.c b/builtin/index-pack.c index acdda17d84..d967d188a3 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1004,7 +1004,9 @@ static struct base_data *find_unresolved_deltas_1(struct base_data *base, if (!compare_and_swap_type(&child->real_type, OBJ_REF_DELTA, 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); if (base->ref_first == base->ref_last && base->ofs_last == -1) diff --git a/t/t5309-pack-delta-cycles.sh b/t/t5309-pack-delta-cycles.sh index 491556dad9..6c209ad45c 100755 --- a/t/t5309-pack-delta-cycles.sh +++ b/t/t5309-pack-delta-cycles.sh @@ -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_expect_failure 'failover to an object in another pack' ' +test_expect_success 'failover to an object in another pack' ' clear_packs && 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 && { pack_header 3 && @@ -77,7 +77,7 @@ test_expect_failure 'failover to a duplicate object in the same pack' ' pack_obj $A } >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 |
