[MSAFD] Fix some return codes and better parameter checks based on wine tests CORE-12104

svn path=/trunk/; revision=72948
This commit is contained in:
Peter Hater
2016-10-10 06:38:52 +00:00
parent aef3f9c467
commit 91a772cfd5
+30 -6
View File
@@ -2189,11 +2189,17 @@ WSPIoctl(IN SOCKET Handle,
else
return NO_ERROR;
case FIONREAD:
if( cbOutBuffer < sizeof(INT) || IS_INTRESOURCE(lpvOutBuffer) )
if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
{
*lpcbBytesReturned = sizeof(ULONG);
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
if (cbOutBuffer < sizeof(ULONG))
{
*lpErrno = WSAEINVAL;
return SOCKET_ERROR;
}
*lpErrno = GetSocketInformation(Socket, AFD_INFO_RECEIVE_CONTENT_SIZE, NULL, (PULONG)lpvOutBuffer, NULL);
if (*lpErrno != NO_ERROR)
return SOCKET_ERROR;
@@ -2203,11 +2209,17 @@ WSPIoctl(IN SOCKET Handle,
return NO_ERROR;
}
case SIOCATMARK:
if (cbOutBuffer < sizeof(BOOL) || IS_INTRESOURCE(lpvOutBuffer))
if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
{
*lpcbBytesReturned = sizeof(BOOL);
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
if (cbOutBuffer < sizeof(BOOL))
{
*lpErrno = WSAEINVAL;
return SOCKET_ERROR;
}
/* FIXME: Return false for now */
*(BOOL*)lpvOutBuffer = FALSE;
@@ -2220,16 +2232,28 @@ WSPIoctl(IN SOCKET Handle,
return SOCKET_ERROR;
case SIO_ADDRESS_LIST_QUERY:
if (cbOutBuffer < (sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress)) || IS_INTRESOURCE(lpvOutBuffer))
if (IS_INTRESOURCE(lpvOutBuffer) || cbOutBuffer == 0)
{
*lpcbBytesReturned = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
if (cbOutBuffer < sizeof(INT))
{
*lpErrno = WSAEINVAL;
return SOCKET_ERROR;
}
*lpcbBytesReturned = sizeof(SOCKET_ADDRESS_LIST) +
sizeof(Socket->SharedData->WSLocalAddress);
*lpcbBytesReturned = sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress);
((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->iAddressCount = 1;
if (cbOutBuffer < (sizeof(SOCKET_ADDRESS_LIST) + sizeof(Socket->SharedData->WSLocalAddress)))
{
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}
((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].iSockaddrLength = sizeof(Socket->SharedData->WSLocalAddress);
((SOCKET_ADDRESS_LIST*)lpvOutBuffer)->Address[0].lpSockaddr = &Socket->SharedData->WSLocalAddress;
@@ -2684,7 +2708,7 @@ WSPAddressToString(IN LPSOCKADDR lpsaAddress,
if (*lpdwAddressStringLength < size)
{
*lpdwAddressStringLength = size;
*lpErrno = WSAENOBUFS;
*lpErrno = WSAEFAULT;
return SOCKET_ERROR;
}