[PATCH 2/2] ws2_32: Fix buffer size query in WSAAddressToStringW.

Hans Leidekker hans at codeweavers.com
Wed Jan 20 08:56:30 CST 2021


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/ws2_32/socket.c     | 25 +++++--------------------
 dlls/ws2_32/tests/sock.c | 18 ++++++++++++++++++
 2 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 5b9b8c27fb3..9fc913a819d 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -8518,30 +8518,15 @@ INT WINAPI WSAAddressToStringW( LPSOCKADDR sockaddr, DWORD len,
                                 LPWSAPROTOCOL_INFOW info, LPWSTR string,
                                 LPDWORD lenstr )
 {
-    INT   ret;
-    DWORD size;
-    WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
-    CHAR bufAddr[54];
+    INT ret;
+    char buf[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
 
     TRACE( "(%p, %d, %p, %p, %p)\n", sockaddr, len, info, string, lenstr );
 
-    size = *lenstr;
-    ret = WSAAddressToStringA(sockaddr, len, NULL, bufAddr, &size);
-
-    if (ret) return ret;
+    if ((ret = WSAAddressToStringA(sockaddr, len, NULL, buf, lenstr))) return ret;
 
-    MultiByteToWideChar(CP_ACP, 0, bufAddr, size, buffer, ARRAY_SIZE(buffer));
-
-    if (*lenstr <  size)
-    {
-        *lenstr = size;
-        SetLastError(WSAEFAULT);
-        return SOCKET_ERROR;
-    }
-
-    TRACE("=> %s,%u bytes\n", debugstr_w(buffer), size);
-    *lenstr = size;
-    lstrcpyW( string, buffer );
+    MultiByteToWideChar(CP_ACP, 0, buf, *lenstr, string, *lenstr);
+    TRACE("=> %s,%u chars\n", debugstr_w(string), *lenstr);
     return 0;
 }
 
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 81536cb9dbe..cab25baf1d1 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -2923,11 +2923,29 @@ static void test_WSAAddressToString(void)
     sockaddr.sin_family = AF_INET;
     sockaddr.sin_addr.s_addr = 0;
     sockaddr.sin_port = 0;
+    WSASetLastError( 0xdeadbeef );
     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, output, &len );
     ok( ret == SOCKET_ERROR, "WSAAddressToStringA() returned %d, expected SOCKET_ERROR\n", ret );
     ok( WSAGetLastError() == WSAEFAULT, "WSAAddressToStringA() gave error %d, expected WSAEFAULT\n", WSAGetLastError() );
     ok( len == 8, "WSAAddressToStringA() gave length %d, expected 8\n", len );
 
+    len = 0;
+    sockaddr.sin_family = AF_INET;
+    sockaddr.sin_addr.s_addr = 0;
+    sockaddr.sin_port = 0;
+    WSASetLastError( 0xdeadbeef );
+    ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, NULL, &len );
+    ok( ret == SOCKET_ERROR, "got %d\n", ret );
+    ok( WSAGetLastError() == WSAEFAULT, "got %08x\n", WSAGetLastError() );
+    ok( len == 8, "got %u\n", len );
+
+    len = ARRAY_SIZE(outputW);
+    memset( outputW, 0, sizeof(outputW) );
+    ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, outputW, &len );
+    ok( !ret, "WSAAddressToStringW() returned %d\n", ret );
+    ok( len == 8, "got %u\n", len );
+    ok( !wcscmp(outputW, L"0.0.0.0"), "got %s\n", wine_dbgstr_w(outputW) );
+
     for (i = 0; i < 2; i++)
     {
         for (j = 0; j < ARRAY_SIZE(ipv4_tests); j++)
-- 
2.29.2




More information about the wine-devel mailing list