- 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:
Cameron Gutman
2010-06-06 23:07:26 +00:00
parent 444eec4511
commit fbc1db9487
3 changed files with 59 additions and 28 deletions
+36 -12
View File
@@ -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)
+9 -5
View File
@@ -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 */
+14 -11
View File
@@ -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);
}