]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bundle-uri: stop sending invalid bundle configuration
authorJustin Tobler <jltobler@gmail.com>
Wed, 8 Jul 2026 15:03:35 +0000 (17:03 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Jul 2026 20:54:16 +0000 (13:54 -0700)
When bundle-URI info is requested by the client, the server responds
with all "bundle.*" config lines as key=value packet lines. On the
client-side, the received bundle config packet lines are always expected
to contain both a key and a value otherwise the client errors out during
parsing. The server performs no validation of the read bundle
configuration though which results in any misconfiguration on the
server-side, such as bundle configuration with an empty value, being
blindly sent to the client.

To avoid having the server transmit invalid configuration to clients,
only send bundle configuration that has non-empty values.

This change makes bundle-URI information sent by the server
syntactically correct, but semantically it still can be invalid. For
example the server may end up sending `bundle.bundle-1.creationToken`,
but be lacking a `bundle.bundle-1.uri` for that bundle. The `uri` is
mandatory, thus the client cannot process this bundle and will error
with the message:

    error: bundle 'bundle-1' has no uri

Fixing this would require a more complex solution, because bundles need
to be validated as a whole and not line-by-line. This is considered
outside the scope of this change.

Co-authored-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
bundle-uri.c
t/lib-bundle-uri-protocol.sh

index 3b2e347288c3b73a5e1aad63154ba754e3c0b833..f956d3db7bf0e4de0842cb72f7773237a6195bea 100644 (file)
@@ -946,8 +946,12 @@ static int config_to_packet_line(const char *key, const char *value,
 {
        struct packet_reader *writer = data;
 
-       if (starts_with(key, "bundle."))
-               packet_write_fmt(writer->fd, "%s=%s", key, value);
+       if (starts_with(key, "bundle.")) {
+               if (value && *value)
+                       packet_write_fmt(writer->fd, "%s=%s", key, value);
+               else
+                       warning(_("config '%s' has no value"), key);
+       }
 
        return 0;
 }
index de09b6b02e248583d972ac5340fb2f550da3ac7f..e0e19715cd84c1963d66855471c0dbeb50d27279 100644 (file)
@@ -214,3 +214,26 @@ test_expect_success "test bundle-uri with $BUNDLE_URI_PROTOCOL:// using protocol
                >actual &&
        test_cmp_config_output expect actual
 '
+
+test_expect_success "test bundle-uri with $BUNDLE_URI_PROTOCOL:// using protocol v2 with empty value" '
+       test_config -C "$BUNDLE_URI_PARENT" \
+               bundle.bundle1.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED-1.bdl" &&
+       test_config -C "$BUNDLE_URI_PARENT" \
+               bundle.bundle2.uri "" &&
+
+       # The empty bundle.bundle2.uri value is invalid configuration and the
+       # server must not advertise it to the client.
+       cat >expect <<-EOF &&
+       [bundle]
+               version = 1
+               mode = all
+       [bundle "bundle1"]
+               uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED-1.bdl
+       EOF
+
+       test-tool bundle-uri \
+               ls-remote \
+               "$BUNDLE_URI_REPO_URI" \
+               >actual &&
+       test_cmp_config_output expect actual
+'