1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-25 01:02:24 +00:00

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.

[originally from svn r10121]
This commit is contained in:
Simon Tatham 2014-01-25 15:58:57 +00:00
parent 8da4fa5063
commit 2b70f39061
3 changed files with 33 additions and 10 deletions

5
ssh.c
View File

@ -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);

View File

@ -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.

View File

@ -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.