[PATCH 1/2] ws2_32: Extract IPv6 address from brackets in getaddrinfo (try 2)
Bruno Jesus
bjesus at codeweavers.com
Tue Jun 13 00:07:49 CDT 2017
From: Owen Rudge <orudge at codeweavers.com>
try 2:
Fix family check
Don't leak hostname
Signed-off-by: Bruno Jesus <bjesus at codeweavers.com>
---
dlls/ws2_32/socket.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 1524192854..8176f898dd 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -6557,7 +6557,7 @@ int WINAPI WS_getaddrinfo(LPCSTR nodename, LPCSTR servname, const struct WS_addr
struct addrinfo *unixaires = NULL;
int result;
struct addrinfo unixhints, *punixhints = NULL;
- char *hostname;
+ char *hostname, *nodeV6 = NULL;
const char *node;
*res = NULL;
@@ -6575,8 +6575,28 @@ int WINAPI WS_getaddrinfo(LPCSTR nodename, LPCSTR servname, const struct WS_addr
else if (!nodename[0])
node = hostname;
else
+ {
node = nodename;
+ /* Check for [ipv6] or [ipv6]:portnumber, which are supported by Windows */
+ if (!hints || hints->ai_family == WS_AF_UNSPEC || hints->ai_family == WS_AF_INET6)
+ {
+ char *close_bracket;
+
+ if (node[0] == '[' && (close_bracket = strchr(node + 1, ']')))
+ {
+ nodeV6 = HeapAlloc(GetProcessHeap(), 0, strlen(node) + 1);
+ if (!nodeV6)
+ {
+ HeapFree(GetProcessHeap(), 0, hostname);
+ return WSA_NOT_ENOUGH_MEMORY;
+ }
+ lstrcpynA(nodeV6, node + 1, close_bracket - node);
+ node = nodeV6;
+ }
+ }
+ }
+
/* servname tweak required by OSX and BSD kernels */
if (servname && !servname[0]) servname = "0";
@@ -6598,6 +6618,7 @@ int WINAPI WS_getaddrinfo(LPCSTR nodename, LPCSTR servname, const struct WS_addr
{
SetLastError(WSAESOCKTNOSUPPORT);
HeapFree(GetProcessHeap(), 0, hostname);
+ HeapFree(GetProcessHeap(), 0, nodeV6);
return SOCKET_ERROR;
}
@@ -6630,6 +6651,7 @@ int WINAPI WS_getaddrinfo(LPCSTR nodename, LPCSTR servname, const struct WS_addr
}
TRACE("%s, %s %p -> %p %d\n", debugstr_a(nodename), debugstr_a(servname), hints, res, result);
HeapFree(GetProcessHeap(), 0, hostname);
+ HeapFree(GetProcessHeap(), 0, nodeV6);
if (!result) {
struct addrinfo *xuai = unixaires;
--
2.11.0
More information about the wine-patches
mailing list