Juan Lang : ws2_32: Set length on successful return from WSAStringToAddress .
Alexandre Julliard
julliard at winehq.org
Thu Apr 7 07:36:43 CDT 2011
Module: wine
Branch: stable
Commit: 2874b0f7f3f10b0c9f3fb117e3b4a79407f23622
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2874b0f7f3f10b0c9f3fb117e3b4a79407f23622
Author: Juan Lang <juan.lang at 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;
More information about the wine-cvs
mailing list