diff options
Diffstat (limited to 'mojo/edk/system/message_pipe_dispatcher.cc')
-rw-r--r-- | mojo/edk/system/message_pipe_dispatcher.cc | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc index a4bbaaf..7e69b73 100644 --- a/mojo/edk/system/message_pipe_dispatcher.cc +++ b/mojo/edk/system/message_pipe_dispatcher.cc @@ -470,8 +470,15 @@ void MessagePipeDispatcher::CloseImplNoLock() { // destruction). So to avoid UAF, manually add a reference and only release it // if the task runs. AddRef(); - internal::g_io_thread_task_runner->PostTask( - FROM_HERE, base::Bind(&MessagePipeDispatcher::CloseOnIOAndRelease, this)); + if (!internal::g_io_thread_task_runner->PostTask( + FROM_HERE, + base::Bind(&MessagePipeDispatcher::CloseOnIOAndRelease, this))) { + // Avoid a shutdown leak in unittests. If the thread is shutting down, + // we can't connect to the other end to let it know that we're closed either + // way. + if (!transferable_ && non_transferable_state_ == WAITING_FOR_READ_OR_WRITE) + Release(); + } } void MessagePipeDispatcher::SerializeInternal() { |