Module: wine Branch: master Commit: dc02bbee547266ef4c55bc9105e0337ffcedda83 URL: https://source.winehq.org/git/wine.git/?a=commit;h=dc02bbee547266ef4c55bc910...
Author: Hans Leidekker hans@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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++)