mirror of
https://github.com/reactos/reactos.git
synced 2024-11-19 21:48:10 +00:00
Prevent crash when a thread is terminated while sending a cross-thread
message svn path=/trunk/; revision=10719
This commit is contained in:
parent
5dda152b8d
commit
16034df8e6
1 changed files with 16 additions and 1 deletions
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: msgqueue.c,v 1.104 2004/08/25 22:31:01 gvg Exp $
|
||||
/* $Id: msgqueue.c,v 1.105 2004/08/28 15:01:46 gvg Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -813,6 +813,7 @@ Notified:
|
|||
{
|
||||
/* only dereference our message queue if the message has not been timed out */
|
||||
IntDereferenceMessageQueue(MessageQueue);
|
||||
IntDereferenceMessageQueue(Message->SenderQueue);
|
||||
}
|
||||
|
||||
/* only free the message if not freed already */
|
||||
|
@ -867,6 +868,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue,
|
|||
Message->CompletionEvent = &CompletionEvent;
|
||||
Message->Result = &Result;
|
||||
Message->SenderQueue = ThreadQueue;
|
||||
IntReferenceMessageQueue(ThreadQueue);
|
||||
Message->CompletionCallback = NULL;
|
||||
|
||||
IntReferenceMessageQueue(MessageQueue);
|
||||
|
@ -928,6 +930,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue,
|
|||
Message->Result = NULL;
|
||||
RemoveEntryList(&Message->DispatchingListEntry);
|
||||
IntDereferenceMessageQueue(MessageQueue);
|
||||
IntDereferenceMessageQueue(ThreadQueue);
|
||||
break;
|
||||
}
|
||||
Entry = Entry->Flink;
|
||||
|
@ -986,6 +989,7 @@ MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue,
|
|||
Message->Result = NULL;
|
||||
RemoveEntryList(&Message->DispatchingListEntry);
|
||||
IntDereferenceMessageQueue(MessageQueue);
|
||||
IntDereferenceMessageQueue(ThreadQueue);
|
||||
break;
|
||||
}
|
||||
Entry = Entry->Flink;
|
||||
|
@ -1194,6 +1198,17 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue)
|
|||
ExFreePool(CurrentSentMessage);
|
||||
}
|
||||
|
||||
/* tell other threads not to bother returning any info to us */
|
||||
while (! IsListEmpty(&MessageQueue->DispatchingMessagesHead))
|
||||
{
|
||||
CurrentEntry = RemoveHeadList(&MessageQueue->DispatchingMessagesHead);
|
||||
CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE,
|
||||
DispatchingListEntry);
|
||||
CurrentSentMessage->CompletionEvent = NULL;
|
||||
CurrentSentMessage->Result = NULL;
|
||||
IntDereferenceMessageQueue(MessageQueue);
|
||||
}
|
||||
|
||||
IntUnLockMessageQueue(MessageQueue);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue