- 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
LIST_ENTRY SockHelpersListHead = { NULL, NULL };
ULONG SockAsyncThreadRefCount;
HANDLE SockAsyncHelperAfdHandle;
LIST_ENTRY SockHelpersListHead = { NULL, NULL };
ULONG SockAsyncThreadRefCount;
HANDLE SockAsyncHelperAfdHandle;
-HANDLE SockAsyncCompletionPort;
+HANDLE SockAsyncCompletionPort = NULL;
BOOLEAN SockAsyncSelectCalled;
BOOLEAN SockAsyncSelectCalled;
}
LeaveCriticalSection(&SocketListLock);
}
LeaveCriticalSection(&SocketListLock);
- HeapFree(GlobalHeap, 0, Socket);
-
/* Close the handle */
NtClose((HANDLE)Handle);
NtClose(SockEvent);
/* Close the handle */
NtClose((HANDLE)Handle);
NtClose(SockEvent);
+ HeapFree(GlobalHeap, 0, Socket);
return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
}
return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
}
/* Check if the Thread Already Exists */
if (SockAsyncThreadRefCount)
{
/* Check if the Thread Already Exists */
if (SockAsyncThreadRefCount)
{
+ ASSERT(SockAsyncCompletionPort);
IO_COMPLETION_ALL_ACCESS,
NULL,
2); // Allow 2 threads only
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;
/* Protect Handle */
HandleFlags.ProtectFromClose = TRUE;
HandleFlags.Inherit = FALSE;
- 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;
if (ReturnedBytes)
*ReturnedBytes = (Status == STATUS_SUCCESS) ? Received : 0;