]> granicus.if.org Git - git/commitdiff
remote-curl: handle URLs without protocol
authorJeff King <peff@peff.net>
Wed, 7 Sep 2016 20:06:42 +0000 (16:06 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Sep 2016 18:23:43 +0000 (11:23 -0700)
Generally remote-curl would never see a URL that did not
have "proto:" at the beginning, as that is what tells git to
run the "git-remote-proto" helper (and git-remote-http, etc,
are aliases for git-remote-curl).

However, the special syntax "proto::something" will run
git-remote-proto with only "something" as the URL. So a
malformed URL like:

  http::/example.com/repo.git

will feed the URL "/example.com/repo.git" to
git-remote-http. The resulting URL has no protocol, but the
code added by 372370f (http: use credential API to handle
proxy authentication, 2016-01-26) does not handle this case
and segfaults.

For the purposes of this code, we don't really care what the
exact protocol; only whether or not it is https. So let's
just assume that a missing protocol is not, and curl will
handle the real error (which is that the URL is nonsense).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
http.c
t/t5550-http-fetch-dumb.sh

diff --git a/http.c b/http.c
index 1044f9ba0e28ff825fa58c56d535861cd9f56a59..057f250b9c4323744587f28a64ad432a7c1bcc93 100644 (file)
--- a/http.c
+++ b/http.c
@@ -590,7 +590,7 @@ static CURL *get_curl_handle(void)
         * precedence here, as in CURL.
         */
        if (!curl_http_proxy) {
-               if (!strcmp(http_auth.protocol, "https")) {
+               if (http_auth.protocol && !strcmp(http_auth.protocol, "https")) {
                        var_override(&curl_http_proxy, getenv("HTTPS_PROXY"));
                        var_override(&curl_http_proxy, getenv("https_proxy"));
                } else {
index 64146352ae20e9a5abdcda77be514d0f3264c3b8..9249140f99890f67d57d689884ba2975bb1bd39f 100755 (executable)
@@ -250,5 +250,13 @@ test_expect_success 'git client does not send an empty Accept-Language' '
        ! grep "^Accept-Language:" stderr
 '
 
+test_expect_success 'remote-http complains cleanly about malformed urls' '
+       # do not actually issue "list" or other commands, as we do not
+       # want to rely on what curl would actually do with such a broken
+       # URL. This is just about making sure we do not segfault during
+       # initialization.
+       test_must_fail git remote-http http::/example.com/repo.git
+'
+
 stop_httpd
 test_done