All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
       [not found] <20111022001704.3115.87464.reportbug@hejmo>
@ 2012-06-10  9:05 ` Jonathan Nieder
  2012-06-12 18:46   ` René Scharfe
  0 siblings, 1 reply; 9+ messages in thread
From: Jonathan Nieder @ 2012-06-10  9:05 UTC (permalink / raw)
  To: Eduardo Trápani; +Cc: git, René Scharfe, YOSHIFUJI Hideaki

Hi Eduardo,

Eduardo Trápani wrote[1]:

> git clone ssh://[2001:0:53aa:64c:1845:430c:4179:d71f]:3333/deponejo/unua
>
> Will try to connect to port 22 and not 3333.  The port number seems to be
> ignored.

True.  How about something like this (untested)?

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
[1] http://bugs.debian.org/646178

 connect.c |   14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git i/connect.c w/connect.c
index 912cddee..7ec1b258 100644
--- i/connect.c
+++ w/connect.c
@@ -494,11 +494,19 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
 	if (host[0] == '[') {
 		end = strchr(host + 1, ']');
 		if (end) {
-			if (protocol != PROTO_GIT) {
+			if (protocol == PROTO_GIT)
+				end++;
+			else {
 				*end = 0;
 				host++;
+				end++;
+				if (!*end || *end == c)
+					; /* good */
+				else if (protocol == PROTO_SSH && c != ':' && *end == ':')
+					port = end + 1;
+				else
+					die("garbage after [] string in URL");
 			}
-			end++;
 		} else
 			end = host;
 	} else
@@ -535,7 +543,7 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
 	/*
 	 * Add support for ssh port: ssh://host.xy:<port>/...
 	 */
-	if (protocol == PROTO_SSH && host != url)
+	if (protocol == PROTO_SSH && host != url && !port)
 		port = get_port(host);
 
 	if (protocol == PROTO_GIT) {

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
  2012-06-10  9:05 ` git: Wrong parsing of ssh urls with IPv6 literals ignores port Jonathan Nieder
@ 2012-06-12 18:46   ` René Scharfe
  2012-06-12 20:29     ` Jonathan Nieder
  0 siblings, 1 reply; 9+ messages in thread
From: René Scharfe @ 2012-06-12 18:46 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: Eduardo Trápani, git, YOSHIFUJI Hideaki

Am 10.06.2012 11:05, schrieb Jonathan Nieder:
> Hi Eduardo,
> 
> Eduardo Trápani wrote[1]:
> 
>> git clone ssh://[2001:0:53aa:64c:1845:430c:4179:d71f]:3333/deponejo/unua
>>
>> Will try to connect to port 22 and not 3333.  The port number seems to be
>> ignored.
> 
> True.  How about something like this (untested)?
> 
> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
> [1] http://bugs.debian.org/646178
> 
>   connect.c |   14 +++++++++++---
>   1 file changed, 11 insertions(+), 3 deletions(-)

How about this instead?  Except perhaps with a commit message that is vaguely
understandable?

-- >8 --
If we encounter an address part shaped like "[HOST]:PORT", we skip the opening
bracket and replace the closing one with a NUL.  The variable host then points
to HOST and we've cut off the PORT part.  Thus, when we go looking for it using
host a bit later, we can't find it.  Start at end instead, which either points
to the colon, if present, or is equal to host.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
---
We have similar code in daemon.c.  Can we share more?  And make it testable?

 connect.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/connect.c b/connect.c
index 912cdde..41b7400 100644
--- a/connect.c
+++ b/connect.c
@@ -536,7 +536,7 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
 	 * Add support for ssh port: ssh://host.xy:<port>/...
 	 */
 	if (protocol == PROTO_SSH && host != url)
-		port = get_port(host);
+		port = get_port(end);
 
 	if (protocol == PROTO_GIT) {
 		/* These underlying connection commands die() if they
-- 
1.7.10.2

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
  2012-06-12 18:46   ` René Scharfe
@ 2012-06-12 20:29     ` Jonathan Nieder
  2012-06-12 21:00       ` Jonathan Nieder
  0 siblings, 1 reply; 9+ messages in thread
From: Jonathan Nieder @ 2012-06-12 20:29 UTC (permalink / raw)
  To: René Scharfe; +Cc: Eduardo Trápani, git, YOSHIFUJI Hideaki

René Scharfe wrote:

> How about this instead?

Looks good to me.  Though it would be nice to see

	proto://[::1]trailing-nonsense/

diagnosed on top, too.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
  2012-06-12 20:29     ` Jonathan Nieder
@ 2012-06-12 21:00       ` Jonathan Nieder
  2012-06-13 16:33         ` René Scharfe
  0 siblings, 1 reply; 9+ messages in thread
From: Jonathan Nieder @ 2012-06-12 21:00 UTC (permalink / raw)
  To: René Scharfe; +Cc: Eduardo Trápani, git, YOSHIFUJI Hideaki

Jonathan Nieder wrote:
> René Scharfe wrote:

>> How about this instead?
>
> Looks good to me.

Oh, hold on a second.  Won't this get confused by

	ssh://[::1]/foo/bar/baz:80/qux

?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
  2012-06-12 21:00       ` Jonathan Nieder
@ 2012-06-13 16:33         ` René Scharfe
  2012-06-13 17:21           ` Junio C Hamano
  0 siblings, 1 reply; 9+ messages in thread
From: René Scharfe @ 2012-06-13 16:33 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: Eduardo Trápani, git, YOSHIFUJI Hideaki

Am 12.06.2012 23:00, schrieb Jonathan Nieder:
> Jonathan Nieder wrote:
>> René Scharfe wrote:
>
>>> How about this instead?
>>
>> Looks good to me.
>
> Oh, hold on a second.  Won't this get confused by
>
> 	ssh://[::1]/foo/bar/baz:80/qux
>
> ?

It shouldn't, because the host part is NUL-terminated before get_port() 
is called.  Let's see (with the patch):

	$ git clone ssh://[::1]/foo/bar/baz:80/qux
	Cloning into 'qux'...
	ssh: connect to host ::1 port 22: Connection refused
	fatal: The remote end hung up unexpectedly

René

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
  2012-06-13 16:33         ` René Scharfe
@ 2012-06-13 17:21           ` Junio C Hamano
  2012-06-13 19:43             ` Jonathan Nieder
  0 siblings, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2012-06-13 17:21 UTC (permalink / raw)
  To: René Scharfe
  Cc: Jonathan Nieder, Eduardo Trápani, git, YOSHIFUJI Hideaki

René Scharfe <rene.scharfe@lsrfire.ath.cx> writes:

> Am 12.06.2012 23:00, schrieb Jonathan Nieder:
>> Jonathan Nieder wrote:
>>> René Scharfe wrote:
>>
>>>> How about this instead?
>>>
>>> Looks good to me.
>>
>> Oh, hold on a second.  Won't this get confused by
>>
>> 	ssh://[::1]/foo/bar/baz:80/qux
>>
>> ?
>
> It shouldn't, because the host part is NUL-terminated before
> get_port() is called.  Let's see (with the patch):
>
> 	$ git clone ssh://[::1]/foo/bar/baz:80/qux
> 	Cloning into 'qux'...
> 	ssh: connect to host ::1 port 22: Connection refused
> 	fatal: The remote end hung up unexpectedly
>
> René

Yeah, I was wondering how that would get confused myself.  Jonathan,
ack again?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
  2012-06-13 17:21           ` Junio C Hamano
@ 2012-06-13 19:43             ` Jonathan Nieder
  2012-06-13 20:10               ` Junio C Hamano
  0 siblings, 1 reply; 9+ messages in thread
From: Jonathan Nieder @ 2012-06-13 19:43 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: René Scharfe, Eduardo Trápani, git, YOSHIFUJI Hideaki

On Wed, Jun 13, 2012 at 10:21:04AM -0700, Junio C Hamano wrote:
> René Scharfe <rene.scharfe@lsrfire.ath.cx> writes:
>> Am 12.06.2012 23:00, schrieb Jonathan Nieder:

>>> Oh, hold on a second.  Won't this get confused by
>>>
>>> 	ssh://[::1]/foo/bar/baz:80/qux
[...]
>> It shouldn't, because the host part is NUL-terminated before
>> get_port() is called.  Let's see (with the patch):
[...]
> Yeah, I was wondering how that would get confused myself.  Jonathan,
> ack again?

Yeah.  I had missed that when proto == PROTO_SSH that means the proto
!= PROTO_LOCAL branch has been taken and the port is NUL-terminated.

So

Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>

It seems like a good fix given the current code structure.  Sorry for
the false alarm.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
  2012-06-13 19:43             ` Jonathan Nieder
@ 2012-06-13 20:10               ` Junio C Hamano
  2012-06-13 20:39                 ` Jonathan Nieder
  0 siblings, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2012-06-13 20:10 UTC (permalink / raw)
  To: Jonathan Nieder
  Cc: René Scharfe, Eduardo Trápani, git, YOSHIFUJI Hideaki

Jonathan Nieder <jrnieder@gmail.com> writes:

> On Wed, Jun 13, 2012 at 10:21:04AM -0700, Junio C Hamano wrote:
>> René Scharfe <rene.scharfe@lsrfire.ath.cx> writes:
>>> Am 12.06.2012 23:00, schrieb Jonathan Nieder:
>
>>>> Oh, hold on a second.  Won't this get confused by
>>>>
>>>> 	ssh://[::1]/foo/bar/baz:80/qux
> [...]
>>> It shouldn't, because the host part is NUL-terminated before
>>> get_port() is called.  Let's see (with the patch):
> [...]
>> Yeah, I was wondering how that would get confused myself.  Jonathan,
>> ack again?
>
> Yeah.  I had missed that when proto == PROTO_SSH that means the proto
> != PROTO_LOCAL branch has been taken and the port is NUL-terminated.
>
> So
>
> Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
>
> It seems like a good fix given the current code structure.  Sorry for
> the false alarm.

Thanks.

By the way, it seems that Debian/Ubuntu are still carrying a bit
more changes and rewrites in the connection code as local
patches. Mind upstreaming them for the next cycle?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: git: Wrong parsing of ssh urls with IPv6 literals ignores port
  2012-06-13 20:10               ` Junio C Hamano
@ 2012-06-13 20:39                 ` Jonathan Nieder
  0 siblings, 0 replies; 9+ messages in thread
From: Jonathan Nieder @ 2012-06-13 20:39 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: René Scharfe, Eduardo Trápani, git, YOSHIFUJI Hideaki

Junio C Hamano wrote:

> By the way, it seems that Debian/Ubuntu are still carrying a bit
> more changes and rewrites in the connection code as local
> patches. Mind upstreaming them for the next cycle?

Sure --- based on Erik's advice I think the right thing to do is to
make a simple compatibility wrapper that acts like normal getaddrinfo,
so no one has to learn a new API.  It's a little more expensive (some
malloc() / free() noise) but probably not enough so to be noticeable.

Debian has these patches because the SRV patch is on top of them.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-06-13 20:40 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20111022001704.3115.87464.reportbug@hejmo>
2012-06-10  9:05 ` git: Wrong parsing of ssh urls with IPv6 literals ignores port Jonathan Nieder
2012-06-12 18:46   ` René Scharfe
2012-06-12 20:29     ` Jonathan Nieder
2012-06-12 21:00       ` Jonathan Nieder
2012-06-13 16:33         ` René Scharfe
2012-06-13 17:21           ` Junio C Hamano
2012-06-13 19:43             ` Jonathan Nieder
2012-06-13 20:10               ` Junio C Hamano
2012-06-13 20:39                 ` Jonathan Nieder

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.