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;