X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/32874aeac8dacbca26663777b39a79efc5d8dc4b..2d466ffd08675d26db45e524c2fe6a8cf4628e2b:/winnet.c diff --git a/winnet.c b/winnet.c index 238730c4..621c3cab 100644 --- a/winnet.c +++ b/winnet.c @@ -87,11 +87,6 @@ struct SockAddr_tag { #ifdef IPV6 struct addrinfo *ai; /* Address IPv6 style. */ #endif - /* - * We need to have this lengthy enough to hold *any* hostname - * (including IPv6 reverse...) - */ - char realhost[8192]; }; struct buffer { @@ -213,11 +208,12 @@ SockAddr sk_namelookup(char *host, char **canonicalname) SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); unsigned long a; struct hostent *h = NULL; + char realhost[8192]; /* Clear the structure and default to IPv4. */ memset(ret, 0, sizeof(struct SockAddr_tag)); ret->family = 0; /* We set this one when we have resolved the host. */ - *canonicalname = ret->realhost; /* This makes sure we always have a hostname to return. */ + *realhost = '\0'; if ((a = inet_addr(host)) == (unsigned long) INADDR_NONE) { #ifdef IPV6 @@ -255,7 +251,7 @@ SockAddr sk_namelookup(char *host, char **canonicalname) */ if (ret->family == 0) { /*debug(("Resolving \"%s\" with gethostbyname() (IPv4 only)...\n", host)); */ - if (h = gethostbyname(host)) + if ( (h = gethostbyname(host)) ) ret->family = AF_INET; } } @@ -312,10 +308,9 @@ SockAddr sk_namelookup(char *host, char **canonicalname) ((struct sockaddr *) ret->ai->ai_addr, ret->family == AF_INET ? sizeof(SOCKADDR_IN) : - sizeof(SOCKADDR_IN6), ret->realhost, - sizeof(ret->realhost), NULL, 0, 0) != 0) { - strncpy(ret->realhost, host, - sizeof(ret->realhost)); + sizeof(SOCKADDR_IN6), realhost, + sizeof(realhost), NULL, 0, 0) != 0) { + strncpy(realhost, host, sizeof(realhost)); } } } @@ -325,7 +320,7 @@ SockAddr sk_namelookup(char *host, char **canonicalname) { memcpy(&a, h->h_addr, sizeof(a)); /* This way we are always sure the h->h_name is valid :) */ - strncpy(ret->realhost, h->h_name, sizeof(ret->realhost)); + strncpy(realhost, h->h_name, sizeof(realhost)); } } #ifdef IPV6 @@ -337,9 +332,12 @@ SockAddr sk_namelookup(char *host, char **canonicalname) * success return from inet_addr. */ ret->family = AF_INET; - *canonicalname = host; + strncpy(realhost, host, sizeof(realhost)); } ret->address = ntohl(a); + realhost[lenof(realhost)-1] = '\0'; + *canonicalname = smalloc(1+strlen(realhost)); + strcpy(*canonicalname, realhost); return ret; } @@ -365,10 +363,10 @@ static void sk_tcp_flush(Socket s) */ } -void sk_tcp_close(Socket s); -void sk_tcp_write(Socket s, char *data, int len); -void sk_tcp_write_oob(Socket s, char *data, int len); -char *sk_tcp_socket_error(Socket s); +static void sk_tcp_close(Socket s); +static void sk_tcp_write(Socket s, char *data, int len); +static void sk_tcp_write_oob(Socket s, char *data, int len); +static char *sk_tcp_socket_error(Socket s); Socket sk_new(SockAddr addr, int port, int privport, int oobinline, Plug plug)