[MSAFD]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Mon, 14 Mar 2011 12:48:28 +0000 (12:48 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Mon, 14 Mar 2011 12:48:28 +0000 (12:48 +0000)
- Print the caller in MsafdReturnWithErrno
- Initialize SockAsyncCompletionPort handle
- Check if the creation of the completion port failed
- Defer free of the socket information struct until the socket handle has been closed because the socket may have a pending select. When the socket is closed, the pending select is canceled, thus a apc routine is invoked which access the freed socket information struct.
- Fixes mIRC crash
- Should be merged to 0.3.13 branch

svn path=/trunk/; revision=51047

reactos/dll/win32/msafd/misc/dllmain.c
reactos/dll/win32/msafd/msafd.h

index 3fb76c8..b2680e0 100644 (file)
@@ -27,7 +27,7 @@ CRITICAL_SECTION SocketListLock;
 LIST_ENTRY SockHelpersListHead = { NULL, NULL };
 ULONG SockAsyncThreadRefCount;
 HANDLE SockAsyncHelperAfdHandle;
-HANDLE SockAsyncCompletionPort;
+HANDLE SockAsyncCompletionPort = NULL;
 BOOLEAN SockAsyncSelectCalled;
 
 
@@ -562,12 +562,11 @@ WSPCloseSocket(IN SOCKET Handle,
     }
     LeaveCriticalSection(&SocketListLock);
 
-    HeapFree(GlobalHeap, 0, Socket);
-
     /* Close the handle */
     NtClose((HANDLE)Handle);
     NtClose(SockEvent);
 
+    HeapFree(GlobalHeap, 0, Socket);
     return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
 }
 
@@ -2420,6 +2419,7 @@ BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
     /* Check if the Thread Already Exists */
     if (SockAsyncThreadRefCount)
     {
+        ASSERT(SockAsyncCompletionPort);
         return TRUE;
     }
 
@@ -2430,7 +2430,11 @@ BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
                                       IO_COMPLETION_ALL_ACCESS,
                                       NULL,
                                       2); // Allow 2 threads only
-
+        if (!NT_SUCCESS(Status))
+        {
+             AFD_DbgPrint(MID_TRACE,("Failed to create completion port\n"));
+             return FALSE;
+        }
         /* Protect Handle */   
         HandleFlags.ProtectFromClose = TRUE;
         HandleFlags.Inherit = FALSE;
index d872c97..5202758 100755 (executable)
@@ -488,7 +488,7 @@ MsafdReturnWithErrno(NTSTATUS Status,
     }
     else
     {
-        DbgPrint("%s: Received invalid lpErrno pointer!\n", __FUNCTION__);
+        DbgPrint("%s: Received invalid lpErrno pointer! %s\n", __FUNCTION__);
 
         if (ReturnedBytes)
             *ReturnedBytes = (Status == STATUS_SUCCESS) ? Received : 0;