connect.c: ignore extra colon after hostname
Ignore an extra ':' at the end of the hostname in URL's like "ssh://example.com:/path/to/repo" The colon is meant to separate a port number from the hostname. If the port is empty, the colon should be ignored, see RFC 3986. It had been working for URLs with ssh:// scheme, but was unintentionally broken in 86ceb3, "allow ssh://user@[2001:db8::1]/repo.git" Reported-by: Reid Woodbury Jr. <reidw@rawsound.com> Signed-off-by: Torsten Bögershausen <tboegi@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Torsten Bögershausen committed
Apr 7, 2015 at 22:03 UTC
6b6c5f7a2f66751a93afce54277a1f30ab0dc521
3 files changed
+24
-16
connect.c
+2
@@ -311,6 +311,8 @@ static void get_host_and_port(char **host, const char **port)
311
if (end != colon + 1 && *end == '\0' && 0 <= portnr && portnr < 65536) {
312
*colon = 0;
313
*port = colon + 1;
314
+ } else if (!colon[1]) {
315
+ *colon = 0;
316
}
317
}
318
}
t/t5500-fetch-pack.sh
+10
-7
@@ -576,13 +576,16 @@ do
576
do
577
for h in host user@host user@[::1] user@::1
578
do
579
- test_expect_success "fetch-pack --diag-url $p://$h/$r" '
580
- check_prot_host_port_path $p://$h/$r $p "$h" NONE "/$r"
581
- '
582
- # "/~" -> "~" conversion
583
- test_expect_success "fetch-pack --diag-url $p://$h/~$r" '
584
- check_prot_host_port_path $p://$h/~$r $p "$h" NONE "~$r"
585
- '
579
+ for c in "" :
580
+ do
581
+ test_expect_success "fetch-pack --diag-url $p://$h$c/$r" '
582
+ check_prot_host_port_path $p://$h/$r $p "$h" NONE "/$r"
583
+ '
584
+ # "/~" -> "~" conversion
585
+ test_expect_success "fetch-pack --diag-url $p://$h$c/~$r" '
586
+ check_prot_host_port_path $p://$h/~$r $p "$h" NONE "~$r"
587
+ '
588
+ done
589
done
590
for h in host User@host User@[::1]
591
do
t/t5601-clone.sh
+12
-9
@@ -387,14 +387,17 @@ do
387
done
388
389
#with ssh:// scheme
390
-test_expect_success 'clone ssh://host.xz/home/user/repo' '
391
- test_clone_url "ssh://host.xz/home/user/repo" host.xz "/home/user/repo"
392
-'
393
-
394
-# from home directory
395
-test_expect_success 'clone ssh://host.xz/~repo' '
396
- test_clone_url "ssh://host.xz/~repo" host.xz "~repo"
390
+#ignore trailing colon
391
+for tcol in "" :
392
+do
393
+ test_expect_success "clone ssh://host.xz$tcol/home/user/repo" '
394
+ test_clone_url "ssh://host.xz$tcol/home/user/repo" host.xz /home/user/repo
395
+ '
396
+ # from home directory
397
+ test_expect_success "clone ssh://host.xz$tcol/~repo" '
398
+ test_clone_url "ssh://host.xz$tcol/~repo" host.xz "~repo"
399
'
400
+done
401
402
# with port number
403
test_expect_success 'clone ssh://host.xz:22/home/user/repo' '
@@ -407,9 +410,9 @@ test_expect_success 'clone ssh://host.xz:22/~repo' '
410
'
411
412
#IPv6
410
-for tuah in ::1 [::1] user@::1 user@[::1] [user@::1]
413
+for tuah in ::1 [::1] [::1]: user@::1 user@[::1] user@[::1]: [user@::1] [user@::1]:
414
do
412
- ehost=$(echo $tuah | tr -d "[]")
415
+ ehost=$(echo $tuah | sed -e "s/1]:/1]/ "| tr -d "[]")
416
test_expect_success "clone ssh://$tuah/home/user/repo" "
417
test_clone_url ssh://$tuah/home/user/repo $ehost /home/user/repo
418
"