From: Simon Tatham Date: Sat, 25 Jan 2014 15:58:57 +0000 (+0000) Subject: Avoid misidentifying unbracketed IPv6 literals as host:port. X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=21cc6ccb25afd991a94eff1b8e668cbb66803fb1;p=PuTTY_svn.git Avoid misidentifying unbracketed IPv6 literals as host:port. Both GUI PuTTY front ends have a piece of logic whereby a string is interpreted as host:port if there's _one_ colon in it, but if there's more than one colon then it's assumed to be an IPv6 literal with no trailing port number. This permits the PuTTY command line to take strings such as 'host', 'host:22' or '[::1]:22', but also cope with a bare v6 literal such as '::1'. This logic is also required in the two Plink front ends and in the processing of CONF_loghost for host key indexing in ssh.c, but was missing in all those places. Add it. git-svn-id: http://svn.tartarus.org/sgt/putty@10121 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/ssh.c b/ssh.c index b86f0de1..f8fc1434 100644 --- a/ssh.c +++ b/ssh.c @@ -3419,10 +3419,11 @@ static const char *connect_to_host(Ssh ssh, char *host, int port, /* * A colon suffix on the hostname string also lets us affect - * savedport. + * savedport. (Unless there are multiple colons, in which case + * we assume this is an unbracketed IPv6 literal.) */ colon = host_strrchr(tmphost, ':'); - if (colon) { + if (colon && colon == host_strchr(tmphost, ':')) { *colon++ = '\0'; if (*colon) ssh->savedport = atoi(colon); diff --git a/unix/uxplink.c b/unix/uxplink.c index 961fcf9a..ee45dc04 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -843,10 +843,21 @@ int main(int argc, char **argv) } } - /* - * Trim off a colon suffix if it's there. - */ - host[host_strcspn(host, ":")] = '\0'; + /* + * Trim a colon suffix off the hostname if it's there. In + * order to protect unbracketed IPv6 address literals + * against this treatment, we do not do this if there's + * _more_ than one colon. + */ + { + char *c = host_strchr(host, ':'); + + if (c) { + char *d = host_strchr(c+1, ':'); + if (!d) + *c = '\0'; + } + } /* * Remove any remaining whitespace. diff --git a/windows/winplink.c b/windows/winplink.c index 48232b38..451eff3b 100644 --- a/windows/winplink.c +++ b/windows/winplink.c @@ -520,10 +520,21 @@ int main(int argc, char **argv) } } - /* - * Trim off a colon suffix if it's there. - */ - host[host_strcspn(host, ":")] = '\0'; + /* + * Trim a colon suffix off the hostname if it's there. In + * order to protect unbracketed IPv6 address literals + * against this treatment, we do not do this if there's + * _more_ than one colon. + */ + { + char *c = host_strchr(host, ':'); + + if (c) { + char *d = host_strchr(c+1, ':'); + if (!d) + *c = '\0'; + } + } /* * Remove any remaining whitespace.