From: Philipp Hoppermann Subject: [PATCH 2/2] ws2_32: Fix implementation of InetNtopW. Message-Id: <1469189056-13015-2-git-send-email-plata@mailbox.org> Date: Fri, 22 Jul 2016 14:04:16 +0200 In-Reply-To: <1469189056-13015-1-git-send-email-plata@mailbox.org> References: <1469189056-13015-1-git-send-email-plata@mailbox.org> Replaced call to inet_ntop by more elaborate solution. Signed-off-by: Philipp Hoppermann --- dlls/ws2_32/socket.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 0622060..2045163 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -7934,11 +7934,75 @@ INT WINAPI InetPtonW(INT family, PCWSTR addr, PVOID buffer) } /*********************************************************************** -* InetNtopW (WS2_32.@) -*/ -PCWSTR WINAPI InetNtopW(INT family, PVOID addr, PWSTR stringBuf, SIZE_T stringBufSize) + * InetNtopW (WS2_32.@) + * + * Get string representation of IP address. + * + * PARAMS + * family [I] AF_INET or AF_INET6 + * addr [I] IP address in byte + * buffer [O] IP address as string + * buffer_len [O] length of the buffer in characters + * + * RETURNS + * Success: IP address as string + * Failure: NULL. Use GetLastError() to find the error cause. + * + * Error codes: + * WSAEAFNOSUPPORT + * - family is not AF_INET or AF_INET6 + * ERROR_INVALID_PARAMETER + * - buffer is NULL + * - buffer_len is 0 + * - buffer_len is too small + * (i.e. < 16 for AF_INET or < 46 for AF_INET6) + * + */ +PCWSTR WINAPI InetNtopW(INT family, PVOID addr, PWSTR buffer, SIZE_T buffer_len) { - return inet_ntop(family, addr, stringBuf, stringBufSize); + char *bufferA; + + TRACE("family %d, addr %s, buffer (%p), buffer_len %lu\n", family, debugstr_w(addr), buffer, (unsigned long) buffer_len); + + // check family + if ((family != AF_INET) && (family != AF_INET6)) + { + SetLastError(WSAEAFNOSUPPORT); + return NULL; + } + + // check if buffer is NULL + if (buffer == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; + } + + // check buffer_len + if ((family == AF_INET && buffer_len < 16) || (family == AF_INET6 && buffer_len < 46)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; + } + + // allocate memory for the string representation in char + if (!(bufferA = HeapAlloc(GetProcessHeap(), 0, buffer_len*sizeof(WCHAR)))) + { + SetLastError(WSA_NOT_ENOUGH_MEMORY); + return NULL; + } + + if (WS_inet_ntop(family, addr, bufferA, buffer_len*sizeof(WCHAR)) != NULL) + { + // convert to wchar + MultiByteToWideChar(CP_ACP, 0, bufferA, buffer_len*sizeof(WCHAR), buffer, buffer_len); + + HeapFree(GetProcessHeap(), 0, bufferA); + return buffer; + } else + { + return NULL; + } } /*********************************************************************** -- 2.7.4