ws2_32: Fix buffer size query in WSAAddressToStringW.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2021-01-20 15:56:30 +01:00 committed by Alexandre Julliard
parent e7dc82377b
commit dc02bbee54
2 changed files with 23 additions and 20 deletions

View file

@ -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 = WSAAddressToStringA(sockaddr, len, NULL, buf, lenstr))) return ret;
if (ret) 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;
}

View file

@ -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++)