summaryrefslogtreecommitdiff
path: root/transport.c
diff options
context:
space:
mode:
authorIlari Liusvaara <ilari.liusvaara@elisanet.fi>2010-02-23 12:33:48 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-02-23 21:19:10 (GMT)
commit53a52ff33d42faf2dcceea5b33f8049bd9416555 (patch)
treecb67c42a0d75f71e4aa2883864de3ba0ae814a9b /transport.c
parente923eaeb901ff056421b9007adcbbce271caa7b6 (diff)
downloadgit-53a52ff33d42faf2dcceea5b33f8049bd9416555.zip
git-53a52ff33d42faf2dcceea5b33f8049bd9416555.tar.gz
git-53a52ff33d42faf2dcceea5b33f8049bd9416555.tar.bz2
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.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/transport.c b/transport.c
index 3846aac..d3ec449 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);