for_each_alternate_ref: use strbuf for path allocation
authorJeff King <peff@peff.net>
Wed, 8 Feb 2017 20:52:54 +0000 (15:52 -0500)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Feb 2017 23:39:55 +0000 (15:39 -0800)
We have a string with ".../objects" pointing to the
alternate object store, and overwrite bits of it to look at
other paths in the (potential) git repository holding it.
This works because the only path we care about is "refs",
which is shorter than "objects".

Using a strbuf to hold the path lets us get rid of some
magic numbers, and makes it more obvious that the memory
operations are safe.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
transport.c
index 6fba9e95b24de3376dd166ef2ff4ddacf1baa494..6b7847131f2aac0b4e37c899510c3a6cc94aa5e0 100644 (file)
@@ -1214,34 +1214,34 @@ struct alternate_refs_data {
 static int refs_from_alternate_cb(struct alternate_object_database *e,
                                  void *data)
 {
-       char *other;
-       size_t len;
+       struct strbuf path = STRBUF_INIT;
+       size_t base_len;
        struct remote *remote;
        struct transport *transport;
        const struct ref *extra;
        struct alternate_refs_data *cb = data;
 
-       other = real_pathdup(e->path);
-       if (!other)
-               return 0;
-       len = strlen(other);
-
-       if (len < 8 || memcmp(other + len - 8, "/objects", 8))
+       if (!strbuf_realpath(&path, e->path, 0))
+               goto out;
+       if (!strbuf_strip_suffix(&path, "/objects"))
                goto out;
+       base_len = path.len;
+
        /* Is this a git repository with refs? */
-       memcpy(other + len - 8, "/refs", 6);
-       if (!is_directory(other))
+       strbuf_addstr(&path, "/refs");
+       if (!is_directory(path.buf))
                goto out;
-       other[len - 8] = '\0';
-       remote = remote_get(other);
-       transport = transport_get(remote, other);
+       strbuf_setlen(&path, base_len);
+
+       remote = remote_get(path.buf);
+       transport = transport_get(remote, path.buf);
        for (extra = transport_get_remote_refs(transport);
             extra;
             extra = extra->next)
                cb->fn(extra, cb->data);
        transport_disconnect(transport);
 out:
-       free(other);
+       strbuf_release(&path);
        return 0;
 }