diff options
author | Ilari Liusvaara <ilari.liusvaara@elisanet.fi> | 2010-02-23 14:33:48 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-02-23 13:19:10 -0800 |
commit | 53a52ff33d42faf2dcceea5b33f8049bd9416555 (patch) | |
tree | cb67c42a0d75f71e4aa2883864de3ba0ae814a9b /transport.c | |
parent | e923eaeb901ff056421b9007adcbbce271caa7b6 (diff) | |
download | git-53a52ff33d42faf2dcceea5b33f8049bd9416555.tar.gz |
Allow '+', '-' and '.' in remote helper names
According to relevant RFCs, in addition to alphanumerics, the following
characters are valid in URL scheme parts: '+', '-' and '.', but
currently only alphanumerics are allowed in remote helper names.
Allow those three characters in remote helper names (both 'foo://' and
'foo::' syntax).
Signed-off-by: Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'transport.c')
-rw-r--r-- | transport.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/transport.c b/transport.c index 3846aacb47..d3ec449859 100644 --- a/transport.c +++ b/transport.c @@ -872,6 +872,21 @@ static int is_file(const char *url) return S_ISREG(buf.st_mode); } +static int isurlschemechar(int first_flag, int ch) +{ + /* + * The set of valid URL schemes, as per STD66 (RFC3986) is + * '[A-Za-z][A-Za-z0-9+.-]*'. But use sightly looser check + * of '[A-Za-z0-9][A-Za-z0-9+.-]*' because earlier version + * of check used '[A-Za-z0-9]+' so not to break any remote + * helpers. + */ + int alphanumeric, special; + alphanumeric = ch > 0 && isalnum(ch); + special = ch == '+' || ch == '-' || ch == '.'; + return alphanumeric || (!first_flag && special); +} + static int is_url(const char *url) { const char *url2, *first_slash; @@ -896,7 +911,7 @@ static int is_url(const char *url) */ url2 = url; while (url2 < first_slash - 1) { - if (!isalnum((unsigned char)*url2)) + if (!isurlschemechar(url2 == url, (unsigned char)*url2)) return 0; url2++; } @@ -929,7 +944,7 @@ struct transport *transport_get(struct remote *remote, const char *url) if (url) { const char *p = url; - while (isalnum(*p)) + while (isurlschemechar(p == url, *p)) p++; if (!prefixcmp(p, "::")) helper = xstrndup(url, p - url); |