Hans Leidekker : ws2_32: Fix buffer size query in WSAAddressToStringW.

Alexandre Julliard julliard at winehq.org
Wed Jan 20 16:58:43 CST 2021


Module: wine
Branch: master
Commit: dc02bbee547266ef4c55bc9105e0337ffcedda83
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=dc02bbee547266ef4c55bc9105e0337ffcedda83

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Jan 20 15:56:30 2021 +0100

ws2_32: Fix buffer size query in WSAAddressToStringW.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 88dfc83dbc2..6e783f87ee7 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++)




More information about the wine-cvs mailing list