]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jk/index-pack-dupfix'
authorJunio C Hamano <gitster@pobox.com>
Fri, 14 Feb 2020 20:54:24 +0000 (12:54 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 14 Feb 2020 20:54:24 +0000 (12:54 -0800)
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()

builtin/index-pack.c
t/t5309-pack-delta-cycles.sh

index acdda17d841b450d159370db7e70800807fb1ffc..d967d188a307fe8763b5fdff08b570999e2a853d 100644 (file)
@@ -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)
index 491556dad9792619974851ef255198c5d247af2f..6c209ad45cf5509f46ba977ef46b717dda86f504 100755 (executable)
@@ -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