]> git.ipfire.org Git - thirdparty/git.git/blobdiff - ls-refs.c
reftable: reject 0 object_id_len
[thirdparty/git.git] / ls-refs.c
index be0956891088b6a7181dd43c022b9ecca65c7cd8..54078323dcb92b68463e6c16b23621ae8f47a2f1 100644 (file)
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -40,6 +40,12 @@ static void ensure_config_read(void)
        config_read = 1;
 }
 
+/*
+ * If we see this many or more "ref-prefix" lines from the client, we consider
+ * it "too many" and will avoid using the prefix feature entirely.
+ */
+#define TOO_MANY_PREFIXES 65536
+
 /*
  * Check if one of the prefixes is a prefix of the ref.
  * If no prefixes were provided, all refs match.
@@ -158,20 +164,32 @@ int ls_refs(struct repository *r, struct packet_reader *request)
                        data.peel = 1;
                else if (!strcmp("symrefs", arg))
                        data.symrefs = 1;
-               else if (skip_prefix(arg, "ref-prefix ", &out))
-                       strvec_push(&data.prefixes, out);
+               else if (skip_prefix(arg, "ref-prefix ", &out)) {
+                       if (data.prefixes.nr < TOO_MANY_PREFIXES)
+                               strvec_push(&data.prefixes, out);
+               }
                else if (!strcmp("unborn", arg))
                        data.unborn = allow_unborn;
+               else
+                       die(_("unexpected line: '%s'"), arg);
        }
 
        if (request->status != PACKET_READ_FLUSH)
                die(_("expected flush after ls-refs arguments"));
 
+       /*
+        * If we saw too many prefixes, we must avoid using them at all; as
+        * soon as we have any prefix, they are meant to form a comprehensive
+        * list.
+        */
+       if (data.prefixes.nr >= TOO_MANY_PREFIXES)
+               strvec_clear(&data.prefixes);
+
        send_possibly_unborn_head(&data);
        if (!data.prefixes.nr)
                strvec_push(&data.prefixes, "");
        for_each_fullref_in_prefixes(get_git_namespace(), data.prefixes.v,
-                                    send_ref, &data, 0);
+                                    send_ref, &data);
        packet_fflush(stdout);
        strvec_clear(&data.prefixes);
        strbuf_release(&data.buf);