aboutsummaryrefslogtreecommitdiffstats
path: root/promisor-remote.c
diff options
authorChristian Couder <christian.couder@gmail.com>2025-03-18 12:00:06 +0100
committerJunio C Hamano <gitster@pobox.com>2025-03-18 12:22:33 -0700
commitb059339bb32eb24c51378afd13814f45353fc0c4 (patch)
tree84ff28c49d371c4a8b6b3c28a0a1624bffd7189d /promisor-remote.c
parent9e05fbe61ba029a3ff9a984709875d76341a217c (diff)
downloadgit-b059339bb32eb24c51378afd13814f45353fc0c4.tar.gz
promisor-remote: fix segfault when remote URL is missing
Using strvec_push() to push `NULL` into a 'strvec' results in a segfault, because `xstrdup(NULL)` crashes. So when an URL is missing from the config, let's not push the remote name and URL into the 'strvec's. While at it, let's also not push them in case the URL is empty. It's just not worth the trouble and it's consistent with how Git otherwise treats missing and empty URLs in the same way. Note that in case of missing or empty URL, Git uses the remote name to fetch, which can work if the remote is on the same filesystem. So configurations where the client, server and remote are all on the same filesystem may need URLs to be configured even if they are the same as the remote names. But this is a rare case, and the work around is easy enough. We leave improving the strvec API and/or xstrdup() for a future separate effort. While at it, let's also use git_config_get_string_tmp() instead of git_config_get_string() to simplify memory management. Helped-by: Jeff King <peff@peff.net> Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'promisor-remote.c')
-rw-r--r--promisor-remote.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/promisor-remote.c b/promisor-remote.c
index 6a0a61382f..ba80240f12 100644
--- a/promisor-remote.c
+++ b/promisor-remote.c
@@ -323,13 +323,15 @@ static void promisor_info_vecs(struct repository *repo,
promisor_remote_init(repo);
for (r = repo->promisor_remote_config->promisors; r; r = r->next) {
- char *url;
+ const char *url;
char *url_key = xstrfmt("remote.%s.url", r->name);
- strvec_push(names, r->name);
- strvec_push(urls, git_config_get_string(url_key, &url) ? NULL : url);
+ /* Only add remotes with a non empty URL */
+ if (!git_config_get_string_tmp(url_key, &url) && *url) {
+ strvec_push(names, r->name);
+ strvec_push(urls, url);
+ }
- free(url);
free(url_key);
}
}
@@ -356,10 +358,8 @@ char *promisor_remote_info(struct repository *repo)
strbuf_addch(&sb, ';');
strbuf_addstr(&sb, "name=");
strbuf_addstr_urlencode(&sb, names.v[i], allow_unsanitized);
- if (urls.v[i]) {
- strbuf_addstr(&sb, ",url=");
- strbuf_addstr_urlencode(&sb, urls.v[i], allow_unsanitized);
- }
+ strbuf_addstr(&sb, ",url=");
+ strbuf_addstr_urlencode(&sb, urls.v[i], allow_unsanitized);
}
strvec_clear(&names);