And add a test to show that inet_pton does not accept hexadecimal IPv4 addresses, and another test to demonstrate that it has the same leading double colon bug as RtlIpv6StringToAddress.
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- v2: Put the break statements back in that I took out while tweaking this patch and failed to put back in before sending --- configure.ac | 1 - dlls/ws2_32/socket.c | 25 ++++++++++++------------- dlls/ws2_32/tests/sock.c | 6 +++++- 3 files changed, 17 insertions(+), 15 deletions(-)
diff --git a/configure.ac b/configure.ac index b7916fcca7..8ddeb0710a 100644 --- a/configure.ac +++ b/configure.ac @@ -2247,7 +2247,6 @@ AC_CHECK_FUNCS(\ inet_addr \ inet_network \ inet_ntop \ - inet_pton \ )
dnl Check for clock_gettime which may be in -lrt diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index d57fc9ecd2..8e66ab8fec 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -8394,10 +8394,10 @@ PCSTR WINAPI WS_inet_ntop( INT family, PVOID addr, PSTR buffer, SIZE_T len ) /*********************************************************************** * inet_pton (WS2_32.@) */ -INT WINAPI WS_inet_pton( INT family, PCSTR addr, PVOID buffer) +INT WINAPI WS_inet_pton(INT family, const char *addr, void *buffer) { -#ifdef HAVE_INET_PTON - int unixaf, ret; + NTSTATUS status; + const char *terminator;
TRACE("family %d, addr %s, buffer (%p)\n", family, debugstr_a(addr), buffer);
@@ -8407,21 +8407,20 @@ INT WINAPI WS_inet_pton( INT family, PCSTR addr, PVOID buffer) return SOCKET_ERROR; }
- unixaf = convert_af_w2u(family); - if (unixaf != AF_INET && unixaf != AF_INET6) + switch (family) { + case WS_AF_INET: + status = RtlIpv4StringToAddressA(addr, TRUE, &terminator, buffer); + break; + case WS_AF_INET6: + status = RtlIpv6StringToAddressA(addr, &terminator, buffer); + break; + default: SetLastError(WSAEAFNOSUPPORT); return SOCKET_ERROR; }
- ret = inet_pton(unixaf, addr, buffer); - if (ret == -1) SetLastError(wsaErrno()); - return ret; -#else - FIXME( "not supported on this platform\n" ); - SetLastError( WSAEAFNOSUPPORT ); - return SOCKET_ERROR; -#endif + return (status == STATUS_SUCCESS && *terminator == 0); }
/*********************************************************************** diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index dcbc9377d7..edf184f908 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -4993,7 +4993,11 @@ static void test_inet_pton(void) "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"}, {AF_INET6, 1, 0, "2001:cdba:0:0:0:0:3257:9652", "2001:cdba::3257:9652", - "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"} + "\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52"}, + {AF_INET, 0, 0, + "0x12345678", NULL, NULL}, + {AF_INET6, 0, 0, /* windows bug */ + "::1:2:3:4:5:6:7", NULL, NULL}, }; int i, ret; DWORD err;