summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2020-02-14 20:54:24 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-02-14 20:54:24 (GMT)
commit7b029ebaefd945b2315281fcdf9c35843641623b (patch)
tree4c8ac3dbc5ab714f6481773faa5d553cbf3577d6
parentaa21cc97bd10ab0b62f6d951ff2ff725261e326e (diff)
parenta21781011f80c9fcb31e84c7a164611491d8c663 (diff)
downloadgit-7b029ebaefd945b2315281fcdf9c35843641623b.zip
git-7b029ebaefd945b2315281fcdf9c35843641623b.tar.gz
git-7b029ebaefd945b2315281fcdf9c35843641623b.tar.bz2
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.c4
-rwxr-xr-xt/t5309-pack-delta-cycles.sh8
2 files changed, 7 insertions, 5 deletions
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index acdda17..d967d18 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 491556da..6c209ad 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