Module: wine Branch: stable Commit: 2874b0f7f3f10b0c9f3fb117e3b4a79407f23622 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2874b0f7f3f10b0c9f3fb117e3...
Author: Juan Lang juan.lang@gmail.com Date: Thu Dec 2 15:28:23 2010 -0800
ws2_32: Set length on successful return from WSAStringToAddress. (cherry picked from commit 7f5583aee9f8ac782376f73c05049febec6f8049)
---
dlls/ws2_32/socket.c | 2 ++ dlls/ws2_32/tests/sock.c | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 713dab4..8221e72 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -5424,6 +5424,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; @@ -5461,6 +5462,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 96430ff..bebf558 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -1754,8 +1754,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 }; @@ -1819,6 +1820,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;