]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch: fix segfault in --negotiate-only without --negotiation-tip=*
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Thu, 8 Jul 2021 10:53:15 +0000 (12:53 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Jul 2021 15:20:16 +0000 (08:20 -0700)
The recent --negotiate-only option would segfault in the call to
oid_array_for_each() in negotiate_using_fetch() unless one or more
--negotiation-tip=* options were provided.

All of the other tests for the feature combine both, but nothing was
checking this assumption, let's do that and add a test for it. Fixes a
bug in 9c1e657a8fd (fetch: teach independent negotiation (no
packfile), 2021-05-04).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fetch.c
t/t5702-protocol-v2.sh

index dfde96a4354c145dd23da41d3e6819ea3d3bb9b6..3f3fa0859fa7ccca9c782375b6f4d1fdf3790471 100644 (file)
@@ -1990,6 +1990,9 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
                fetch_config_from_gitmodules(sfjc, rs);
        }
 
+       if (negotiate_only && !negotiation_tip.nr)
+               die(_("--negotiate-only needs one or more --negotiate-tip=*"));
+
        if (deepen_relative) {
                if (deepen_relative < 0)
                        die(_("Negative depth in --deepen is not supported"));
index 66af411057c3f278e145b628eea7d1058c8a1ac1..78de1ff2ad5900ddc81c4096b10bce0ad3e48e13 100755 (executable)
@@ -599,6 +599,22 @@ setup_negotiate_only () {
        test_commit -C client three
 }
 
+test_expect_success 'usage: --negotiate-only without --negotiation-tip' '
+       SERVER="server" &&
+       URI="file://$(pwd)/server" &&
+
+       setup_negotiate_only "$SERVER" "$URI" &&
+
+       cat >err.expect <<-\EOF &&
+       fatal: --negotiate-only needs one or more --negotiate-tip=*
+       EOF
+
+       test_must_fail git -c protocol.version=2 -C client fetch \
+               --negotiate-only \
+               origin 2>err.actual &&
+       test_cmp err.expect err.actual
+'
+
 test_expect_success 'file:// --negotiate-only' '
        SERVER="server" &&
        URI="file://$(pwd)/server" &&