]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Improve buffer handling in Windows sk_getaddr() -- we were passing
authorJacob Nevins <jacobn@chiark.greenend.org.uk>
Sun, 8 Nov 2009 18:25:29 +0000 (18:25 +0000)
committerJacob Nevins <jacobn@chiark.greenend.org.uk>
Sun, 8 Nov 2009 18:25:29 +0000 (18:25 +0000)
uninitialised storage into WSAAddressToString()'s length function (and
presumably getting away with it by luck).
Also improve error handling (exposed by my Wine installation, which returns
an error from WSAAddressToString() for connections to localhost for some
reason).

[originally from svn r8737]

windows/winnet.c

index 061f72b1d478e6d73ef8624f7f1daf01fa68ed3f..9d93baa0f25acf667c1d9647bdba082ef06d6e3a 100644 (file)
@@ -584,13 +584,19 @@ void sk_getaddr(SockAddr addr, char *buf, int buflen)
 
 #ifndef NO_IPV6
     if (step.ai) {
+       int err = 0;
        if (p_WSAAddressToStringA) {
-           DWORD dwbuflen;
-           p_WSAAddressToStringA(step.ai->ai_addr, step.ai->ai_addrlen,
-                                 NULL, buf, &dwbuflen);
-           buflen = dwbuflen;
+           DWORD dwbuflen = buflen;
+           err = p_WSAAddressToStringA(step.ai->ai_addr, step.ai->ai_addrlen,
+                                       NULL, buf, &dwbuflen);
        } else
-           strncpy(buf, "IPv6", buflen);
+           err = -1;
+       if (err) {
+           strncpy(buf, addr->hostname, buflen);
+           if (!buf[0])
+               strncpy(buf, "<unknown>", buflen);
+           buf[buflen-1] = '\0';
+       }
     } else
 #endif
     if (SOCKADDR_FAMILY(addr, step) == AF_INET) {