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