From 7f5583aee9f8ac782376f73c05049febec6f8049 Mon Sep 17 00:00:00 2001 From: Juan Lang <juan.lang@gmail.com> Date: Thu, 2 Dec 2010 15:28:23 -0800 Subject: [PATCH] ws2_32: Set length on successful return from WSAStringToAddress. --- dlls/ws2_32/socket.c | 2 ++ dlls/ws2_32/tests/sock.c | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 0bc773ed767..51139c9bd54 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -5953,6 +5953,7 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, res = WSAEFAULT; break; } + *lpAddressLength = sizeof(SOCKADDR_IN); memset(lpAddress, 0, sizeof(SOCKADDR_IN)); ((LPSOCKADDR_IN)lpAddress)->sin_family = AF_INET; @@ -5990,6 +5991,7 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, break; } #ifdef HAVE_INET_PTON + *lpAddressLength = sizeof(SOCKADDR_IN6); memset(lpAddress, 0, sizeof(SOCKADDR_IN6)); ((LPSOCKADDR_IN6)lpAddress)->sin6_family = WS_AF_INET6; diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 6843846fb0e..9e0b4cbc531 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -1801,8 +1801,9 @@ static void test_WSAStringToAddressA(void) static void test_WSAStringToAddressW(void) { INT ret, len; - SOCKADDR_IN sockaddr; + SOCKADDR_IN sockaddr, *sin; SOCKADDR_IN6 sockaddr6; + SOCKADDR_STORAGE sockaddr_storage; int GLE; WCHAR address1[] = { '0','.','0','.','0','.','0', 0 }; @@ -1866,6 +1867,20 @@ static void test_WSAStringToAddressW(void) (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), "WSAStringToAddressW() failed unexpectedly: %d\n", GLE ); + /* Test with a larger buffer than necessary */ + len = sizeof(sockaddr_storage); + sin = (SOCKADDR_IN *)&sockaddr_storage; + sin->sin_port = 0; + sin->sin_addr.s_addr = 0; + + ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)sin, &len ); + ok( (ret == 0 && sin->sin_addr.s_addr == 0xffffffff && sin->sin_port == 0xffff) || + (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), + "WSAStringToAddressW() failed unexpectedly: %d\n", GLE ); + ok( len == sizeof(SOCKADDR_IN) || + broken(len == sizeof(SOCKADDR_STORAGE)) /* NT4/2k */, + "unexpected length %d\n", len ); + len = sizeof(sockaddr6); memset(&sockaddr6, 0, len); sockaddr6.sin6_family = AF_INET6; -- GitLab