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:
parent
e7dc82377b
commit
dc02bbee54
|
@ -8518,30 +8518,15 @@ INT WINAPI WSAAddressToStringW( LPSOCKADDR sockaddr, DWORD len,
|
||||||
LPWSAPROTOCOL_INFOW info, LPWSTR string,
|
LPWSAPROTOCOL_INFOW info, LPWSTR string,
|
||||||
LPDWORD lenstr )
|
LPDWORD lenstr )
|
||||||
{
|
{
|
||||||
INT ret;
|
INT ret;
|
||||||
DWORD size;
|
char buf[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
|
||||||
WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
|
|
||||||
CHAR bufAddr[54];
|
|
||||||
|
|
||||||
TRACE( "(%p, %d, %p, %p, %p)\n", sockaddr, len, info, string, lenstr );
|
TRACE( "(%p, %d, %p, %p, %p)\n", sockaddr, len, info, string, lenstr );
|
||||||
|
|
||||||
size = *lenstr;
|
if ((ret = WSAAddressToStringA(sockaddr, len, NULL, buf, lenstr))) return ret;
|
||||||
ret = WSAAddressToStringA(sockaddr, len, NULL, bufAddr, &size);
|
|
||||||
|
|
||||||
if (ret) return ret;
|
MultiByteToWideChar(CP_ACP, 0, buf, *lenstr, string, *lenstr);
|
||||||
|
TRACE("=> %s,%u chars\n", debugstr_w(string), *lenstr);
|
||||||
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 );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2923,11 +2923,29 @@ static void test_WSAAddressToString(void)
|
||||||
sockaddr.sin_family = AF_INET;
|
sockaddr.sin_family = AF_INET;
|
||||||
sockaddr.sin_addr.s_addr = 0;
|
sockaddr.sin_addr.s_addr = 0;
|
||||||
sockaddr.sin_port = 0;
|
sockaddr.sin_port = 0;
|
||||||
|
WSASetLastError( 0xdeadbeef );
|
||||||
ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, output, &len );
|
ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr, sizeof(sockaddr), NULL, output, &len );
|
||||||
ok( ret == SOCKET_ERROR, "WSAAddressToStringA() returned %d, expected SOCKET_ERROR\n", ret );
|
ok( ret == SOCKET_ERROR, "WSAAddressToStringA() returned %d, expected SOCKET_ERROR\n", ret );
|
||||||
ok( WSAGetLastError() == WSAEFAULT, "WSAAddressToStringA() gave error %d, expected WSAEFAULT\n", WSAGetLastError() );
|
ok( WSAGetLastError() == WSAEFAULT, "WSAAddressToStringA() gave error %d, expected WSAEFAULT\n", WSAGetLastError() );
|
||||||
ok( len == 8, "WSAAddressToStringA() gave length %d, expected 8\n", len );
|
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 (i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
for (j = 0; j < ARRAY_SIZE(ipv4_tests); j++)
|
for (j = 0; j < ARRAY_SIZE(ipv4_tests); j++)
|
||||||
|
|
Loading…
Reference in New Issue