Improve buffer handling in Windows sk_getaddr() -- we were passing
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Sun, 8 Nov 2009 18:25:29 +0000 (18:25 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
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).

git-svn-id: svn://svn.tartarus.org/sgt/putty@8737 cda61777-01e9-0310-a592-d414129be87e

windows/winnet.c

index 061f72b..9d93baa 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) {