mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
[MSAFD]
- Fix many times where we wait for an operation but don't update our status and return if it failed - Fix the overlapped pending case in writing which was completely broken (callers would detect an error but GetLastError would return 0 because we didn't store the error in the lpErrno variable) - Fix many times where we pass a pointer to an event that we close without waiting - Fix a bug in WSPEnumNetworkEvents when we would set WSAEINVAL in the lpErrno variable but not return SOCKET_ERROR so the error got ignored svn path=/trunk/; revision=47643
This commit is contained in:
@@ -566,7 +566,7 @@ WSPCloseSocket(IN SOCKET Handle,
|
||||
NtClose((HANDLE)Handle);
|
||||
NtClose(SockEvent);
|
||||
|
||||
return NO_ERROR;
|
||||
return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -666,13 +666,17 @@ WSPBind(SOCKET Handle,
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
NtClose( SockEvent );
|
||||
HeapFree(GlobalHeap, 0, BindData);
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
|
||||
|
||||
/* Set up Socket Data */
|
||||
Socket->SharedData.State = SocketBound;
|
||||
Socket->TdiAddressHandle = (HANDLE)IOSB.Information;
|
||||
|
||||
NtClose( SockEvent );
|
||||
HeapFree(GlobalHeap, 0, BindData);
|
||||
if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_BIND))
|
||||
if (Socket->HelperEvents & WSH_NOTIFY_BIND)
|
||||
{
|
||||
Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
|
||||
Socket->Handle,
|
||||
@@ -739,14 +743,17 @@ WSPListen(SOCKET Handle,
|
||||
{
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
}
|
||||
|
||||
NtClose( SockEvent );
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
|
||||
|
||||
/* Set to Listening */
|
||||
Socket->SharedData.Listening = TRUE;
|
||||
|
||||
NtClose( SockEvent );
|
||||
|
||||
if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_LISTEN))
|
||||
if (Socket->HelperEvents & WSH_NOTIFY_LISTEN)
|
||||
{
|
||||
Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
|
||||
Socket->Handle,
|
||||
@@ -907,6 +914,7 @@ WSPSelect(int nfds,
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
/* Clear the Structures */
|
||||
@@ -1440,6 +1448,9 @@ WSPConnect(SOCKET Handle,
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
goto notify;
|
||||
}
|
||||
|
||||
/* Dynamic Structure...ugh */
|
||||
@@ -1485,6 +1496,9 @@ WSPConnect(SOCKET Handle,
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
goto notify;
|
||||
}
|
||||
|
||||
/* AFD doesn't seem to care if these are invalid, but let's 0 them anyways */
|
||||
@@ -1516,6 +1530,9 @@ WSPConnect(SOCKET Handle,
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
goto notify;
|
||||
|
||||
Socket->TdiConnectionHandle = (HANDLE)IOSB.Information;
|
||||
|
||||
/* Get any pending connect data */
|
||||
@@ -1539,14 +1556,15 @@ WSPConnect(SOCKET Handle,
|
||||
}
|
||||
}
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Ending\n"));
|
||||
|
||||
notify:
|
||||
/* Re-enable Async Event */
|
||||
SockReenableAsyncSelectEvent(Socket, FD_WRITE);
|
||||
|
||||
/* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
|
||||
SockReenableAsyncSelectEvent(Socket, FD_CONNECT);
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Ending\n"));
|
||||
|
||||
NtClose( SockEvent );
|
||||
|
||||
if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_CONNECT))
|
||||
@@ -2139,8 +2157,12 @@ GetSocketInformation(PSOCKET_INFORMATION Socket,
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
return -1;
|
||||
|
||||
/* Return Information */
|
||||
if (Ulong != NULL)
|
||||
{
|
||||
@@ -2210,11 +2232,12 @@ SetSocketInformation(PSOCKET_INFORMATION Socket,
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
NtClose( SockEvent );
|
||||
|
||||
return 0;
|
||||
return Status == STATUS_SUCCESS ? 0 : -1;
|
||||
|
||||
}
|
||||
|
||||
@@ -2275,11 +2298,12 @@ int CreateContext(PSOCKET_INFORMATION Socket)
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
NtClose( SockEvent );
|
||||
|
||||
return 0;
|
||||
return Status == STATUS_SUCCESS ? 0 : -1;
|
||||
}
|
||||
|
||||
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
|
||||
|
||||
@@ -104,12 +104,16 @@ WSPEventSelect(
|
||||
/* Wait for return */
|
||||
if (Status == STATUS_PENDING) {
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Waited\n"));
|
||||
|
||||
NtClose( SockEvent );
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
|
||||
|
||||
/* Set Socket Data*/
|
||||
@@ -168,13 +172,16 @@ WSPEnumNetworkEvents(
|
||||
/* Wait for return */
|
||||
if (Status == STATUS_PENDING) {
|
||||
WaitForSingleObject(SockEvent, INFINITE);
|
||||
Status = STATUS_SUCCESS;
|
||||
Status = IOSB.Status;
|
||||
}
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Waited\n"));
|
||||
|
||||
NtClose( SockEvent );
|
||||
|
||||
if (Status != STATUS_SUCCESS)
|
||||
return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
|
||||
AFD_DbgPrint(MID_TRACE,("About to touch struct at %x (%d)\n",
|
||||
lpNetworkEvents, sizeof(*lpNetworkEvents)));
|
||||
@@ -226,12 +233,9 @@ WSPEnumNetworkEvents(
|
||||
lpNetworkEvents->iErrorCode[FD_GROUP_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_GROUP_QOS_BIT]);
|
||||
}
|
||||
|
||||
if( NT_SUCCESS(Status) ) *lpErrno = 0;
|
||||
else *lpErrno = WSAEINVAL;
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
|
||||
|
||||
return 0;
|
||||
return MsafdReturnWithErrno(STATUS_SUCCESS, lpErrno, 0, NULL);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
@@ -182,7 +182,7 @@ WSPRecv(SOCKET Handle,
|
||||
|
||||
/* Send IOCTL */
|
||||
Status = NtDeviceIoControlFile((HANDLE)Handle,
|
||||
Event ? Event : SockEvent,
|
||||
Event,
|
||||
APCFunction,
|
||||
APCContext,
|
||||
IOSB,
|
||||
@@ -209,6 +209,9 @@ WSPRecv(SOCKET Handle,
|
||||
/* Return the Flags */
|
||||
*ReceiveFlags = 0;
|
||||
|
||||
if (Status == STATUS_PENDING)
|
||||
return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesRead);
|
||||
|
||||
switch (Status)
|
||||
{
|
||||
case STATUS_RECEIVE_EXPEDITED:
|
||||
@@ -223,7 +226,7 @@ WSPRecv(SOCKET Handle,
|
||||
}
|
||||
|
||||
/* Re-enable Async Event */
|
||||
if (*ReceiveFlags == MSG_OOB)
|
||||
if (*ReceiveFlags & MSG_OOB)
|
||||
{
|
||||
SockReenableAsyncSelectEvent(Socket, FD_OOB);
|
||||
}
|
||||
@@ -334,7 +337,7 @@ WSPRecvFrom(SOCKET Handle,
|
||||
|
||||
/* Send IOCTL */
|
||||
Status = NtDeviceIoControlFile((HANDLE)Handle,
|
||||
Event ? Event : SockEvent,
|
||||
Event,
|
||||
APCFunction,
|
||||
APCContext,
|
||||
IOSB,
|
||||
@@ -356,6 +359,9 @@ WSPRecvFrom(SOCKET Handle,
|
||||
/* Return the Flags */
|
||||
*ReceiveFlags = 0;
|
||||
|
||||
if (Status == STATUS_PENDING)
|
||||
return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesRead);
|
||||
|
||||
switch (Status)
|
||||
{
|
||||
case STATUS_RECEIVE_EXPEDITED: *ReceiveFlags = MSG_OOB;
|
||||
@@ -461,7 +467,7 @@ WSPSend(SOCKET Handle,
|
||||
|
||||
/* Send IOCTL */
|
||||
Status = NtDeviceIoControlFile((HANDLE)Handle,
|
||||
Event ? Event : SockEvent,
|
||||
Event,
|
||||
APCFunction,
|
||||
APCContext,
|
||||
IOSB,
|
||||
@@ -483,7 +489,7 @@ WSPSend(SOCKET Handle,
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
AFD_DbgPrint(MID_TRACE,("Leaving (Pending)\n"));
|
||||
return WSA_IO_PENDING;
|
||||
return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
|
||||
}
|
||||
|
||||
/* Re-enable Async Event */
|
||||
@@ -613,7 +619,7 @@ WSPSendTo(SOCKET Handle,
|
||||
|
||||
/* Send IOCTL */
|
||||
Status = NtDeviceIoControlFile((HANDLE)Handle,
|
||||
Event ? Event : SockEvent,
|
||||
Event,
|
||||
APCFunction,
|
||||
APCContext,
|
||||
IOSB,
|
||||
@@ -638,11 +644,8 @@ WSPSendTo(SOCKET Handle,
|
||||
HeapFree(GlobalHeap, 0, BindAddress);
|
||||
}
|
||||
|
||||
if (Status == STATUS_PENDING)
|
||||
return WSA_IO_PENDING;
|
||||
|
||||
/* Re-enable Async Event */
|
||||
SockReenableAsyncSelectEvent(Socket, FD_WRITE);
|
||||
if (Status != STATUS_PENDING)
|
||||
SockReenableAsyncSelectEvent(Socket, FD_WRITE);
|
||||
|
||||
return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user