git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [REROLL PATCH 3/8] Pass unknown protocols to external protocol handlers

From
ILIlari Liusvaara <ilari.liusvaara@elisanet.fi>
Date
Dec 9, 2009, 15:15 UTC
Message-ID
<20091209151549.GB15673@Knoppix>
In-Reply-To
<7vskbl59ai.fsf@alter.siamese.dyndns.org>
On Tue, Dec 08, 2009 at 03:35:17PM -0800, Junio C Hamano wrote:
Show 30 quoted lines
> Ilari Liusvaara <ilari.liusvaara@elisanet.fi> writes:
> 
> > +const char *remove_ext_force(const char *url)
> > +{
> > +	const char *url2 = url;
> > +	const char *first_colon = NULL;
> > +
> > +	if (!url)
> > +		return NULL;
> > +
> > +	while (*url2 && !first_colon)
> > +		if (*url2 == ':')
> > +			first_colon = url2;
> > +		else
> > +			url2++;
> > +
> > +	if (first_colon && first_colon[1] == ':')
> > +		return first_colon + 2;
> > +	else
> > +		return url;
> > +}
> 
> Sorry, I am slow today, but is this any different from:
> 
> 	if (url) {
> 		const char *colon = strchr(url, ':');
> 	        if (colon && colon[1] == ':')
> 	        	return url2 + 2;
> 	}
> 	return url;
Undefined variable url2 (you mean colon?). Changed.
 
Show 19 quoted lines
> > diff --git a/transport.c b/transport.c
> > index 3eea836..e42a82b 100644
> > --- a/transport.c
> > +++ b/transport.c
> > @@ -780,6 +780,58 @@ static int is_file(const char *url)
> >  	return S_ISREG(buf.st_mode);
> >  }
> >  
> > +static const char *strchrc(const char *str, int c)
> > +{
> > +	while (*str)
> > +		if (*str == c)
> > +			return str;
> > +		else
> > +			str++;
> > +	return NULL;
> > +}
> 
> I cannot spot how this is different from strchr()...
Return type. Not that useful. Removed.
 
Show 22 quoted lines
> > +static int is_url(const char *url)
> > +{
> > +	const char *url2, *first_slash;
> > +
> > +	if (!url)
> > +		return 0;
> > +	url2 = url;
> > +	first_slash = strchrc(url, '/');
> > +
> > +	/* Input with no slash at all or slash first can't be URL. */
> > +	if (!first_slash || first_slash == url)
> > +		return 0;
> > +	/* Character before must be : and next must be /. */
> > +	if (first_slash[-1] != ':' || first_slash[1] != '/')
> > +		return 0;
> > +	/* There must be something before the :// */
> > +	if (first_slash == url + 1)
> > +		return 0;
> > +	/*
> > +	 * Check all characters up to first slash. Only alpha, num and
> > +	 * colon (":") are allowed. ":" must be followed by ":" or "/".
> > +	 */

I tightened this a bit, only checking (exclusive) character before first "/" and requiring all-alphanum. The previous rules were apparently leftover from times the "specify remote helper by url" patch didn't exist.

Considering context at call site, it is equivalent, since any ':' must be
followed by '/' or is_url will never be called, and first ':/' must be
exactly at last_slash - 1 (by earlier checks).
 
> Hmm, so "a::::bc:://" is ok?

is_url never gets such thing. Due to "::" it bypasses URL validation. And yes, it is ok.

> Is the reason this does not to check the string up to (first_slash-1) for
> a valid syntax for <scheme> (as in "<scheme>://") because this potentially
> has "<helper>::" in front of it?
It doesn't have '<helper>::' in front of it.
> I cannot tell if you want to allow "<helper1>::<helper2>::<scheme>://..."
> by reading this code.
Allowing or denying that is not up to this function. And one can't chain
helpers that way. It invokes <helper1>
 
Show 6 quoted lines
> > +static int external_specification_len(const char *url)
> > +{
> > +	return strchrc(url, ':') - url;
> > +}
> 
> Does the caller guarantee url has at least one colon in it?
Anything passing is_url() does have ':' in it.
Show 10 quoted lines
> > +	} else if (!is_url(url)
> > +		|| !prefixcmp(url, "file://")
> > +		|| !prefixcmp(url, "git://")
> > +		|| !prefixcmp(url, "ssh://")
> > +		|| !prefixcmp(url, "git+ssh://")
> > +		|| !prefixcmp(url, "ssh+git://")) {
> > +		/* These are builtin smart transports. */
> 
> Hmm, what is !is_url(url) at the beginning for, if this lists "builtin"
> smart transports?
It catches the scp and path syntaxes as not URLs.
 
Show 10 quoted lines
> > +	} else {
> > +		/* Unknown protocol in URL. Pass to external handler. */
> > +		int len = external_specification_len(url);
> > +		char *handler = xmalloc(len + 1);
> > +		handler[len] = 0;
> > +		strncpy(handler, url, len);
> > +		transport_helper_init(ret, handler);
> 
> Hmph, external_specification_len() may get passed a colon-less string
> after all, I think.

Nope, it can't. Else if above snarfs everything that doesn't pass is_url, and string can't pass it without having ':' in it.

-Ilari
Previous: Bert WesargNext: Ilari Liusvaara
Message 10 of 23 in “Remote helpers smart transport extensions”
  1. 0/8 Remote helpers smart transport extensionsIlari Liusvaara, Dec 8, 2009
  2. 1/8 Add remote helper debug modeIlari Liusvaara, Dec 8, 2009
  3. Junio C HamanoDec 8, 2009
  4. 2/8 Support mandatory capabilitiesIlari Liusvaara, Dec 8, 2009
  5. Junio C HamanoDec 8, 2009
  6. Ilari LiusvaaraDec 9, 2009
  7. 3/8 Pass unknown protocols to external protocol handlersIlari Liusvaara, Dec 8, 2009
  8. Junio C HamanoDec 8, 2009
  9. Bert WesargDec 9, 2009
  10. Ilari LiusvaaraDec 9, 2009
  11. 4/8 Refactor git transport options parsingIlari Liusvaara, Dec 8, 2009
  12. 5/8 Support taking over transportsIlari Liusvaara, Dec 8, 2009
  13. Junio C HamanoDec 8, 2009
  14. Ilari LiusvaaraDec 9, 2009
  15. Junio C HamanoDec 9, 2009
  16. Ilari LiusvaaraDec 9, 2009
  17. 6/8 Support remote helpers implementing smart transportsIlari Liusvaara, Dec 8, 2009
  18. Junio C HamanoDec 8, 2009
  19. Ilari LiusvaaraDec 9, 2009
  20. 7/8 Support remote archive from external protocol helpersIlari Liusvaara, Dec 8, 2009
  21. Junio C HamanoDec 8, 2009
  22. Ilari LiusvaaraDec 9, 2009
  23. 8/8 Remove special casing of http, https and ftpIlari Liusvaara, Dec 8, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.