[MSAFD]
authorCameron Gutman <aicommander@gmail.com>
Sun, 6 Jun 2010 23:07:26 +0000 (23:07 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sun, 6 Jun 2010 23:07:26 +0000 (23:07 +0000)
- 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

reactos/dll/win32/msafd/misc/dllmain.c
reactos/dll/win32/msafd/misc/event.c
reactos/dll/win32/msafd/misc/sndrcv.c

index 97e82f8..a8ab0dc 100644 (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)
index 19d5f23..d79fe20 100644 (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 */
index 3c5b2d5..57f9569 100644 (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);
 }