diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 0bc773ed767c6cfd6bee8e2abba9e67a2d6635a7..51139c9bd541c049c308201fc2239b19bbb54c34 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 6843846fb0ebe146667a2e6157d97bf743dcdd99..9e0b4cbc531b923f928fedfb0c914335916d92aa 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;