From 06497952debbf53b9e0269ff649daf34f49d7898 Mon Sep 17 00:00:00 2001 From: Jacob Nevins Date: Sun, 8 Nov 2009 18:25:29 +0000 Subject: [PATCH] Improve buffer handling in Windows sk_getaddr() -- we were passing 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 | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/windows/winnet.c b/windows/winnet.c index 061f72b1..9d93baa0 100644 --- a/windows/winnet.c +++ b/windows/winnet.c @@ -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, "", buflen); + buf[buflen-1] = '\0'; + } } else #endif if (SOCKADDR_FAMILY(addr, step) == AF_INET) { -- 2.45.2