From ee68563f8c5c4781a26b0f2f5dc310cbd6aa950d Mon Sep 17 00:00:00 2001 From: erikchen Date: Mon, 7 Dec 2015 13:00:48 -0800 Subject: ipc: Add debugging to verify the source of ResourceDispatcher crashes. This CL is mostly a reland of https://codereview.chromium.org/1354063002/. It adds a MessageVerifier that verifies specific IPC messages right before serialization, and right after deserialization. It also adds the same CHECKs to the application logic that uses Chrome IPC. BUG=527588 Review URL: https://codereview.chromium.org/1500013003 Cr-Commit-Position: refs/heads/master@{#363577} --- ipc/ipc_channel.h | 5 +++++ ipc/ipc_channel_common.cc | 12 ++++++++++++ ipc/ipc_channel_reader.cc | 6 ++++++ ipc/ipc_channel_win.cc | 11 +++++++++++ 4 files changed, 34 insertions(+) (limited to 'ipc') diff --git a/ipc/ipc_channel.h b/ipc/ipc_channel.h index 5345112..58fc069 100644 --- a/ipc/ipc_channel.h +++ b/ipc/ipc_channel.h @@ -157,6 +157,11 @@ class IPC_EXPORT Channel : public Endpoint { ~Channel() override; + // TODO(erikchen): Temporary code to help track http://crbug.com/527588. + using MessageVerifier = void (*)(const Message*); + static void SetMessageVerifier(MessageVerifier verifier); + static MessageVerifier GetMessageVerifier(); + // Connect the pipe. On the server side, this will initiate // waiting for connections. On the client, it attempts to // connect to a pre-existing pipe. Note, calling Connect() diff --git a/ipc/ipc_channel_common.cc b/ipc/ipc_channel_common.cc index f841dab..3fddf9a 100644 --- a/ipc/ipc_channel_common.cc +++ b/ipc/ipc_channel_common.cc @@ -6,6 +6,8 @@ namespace IPC { +static Channel::MessageVerifier g_message_verifier = nullptr; + // static scoped_ptr Channel::CreateClient( const IPC::ChannelHandle& channel_handle, @@ -47,6 +49,16 @@ scoped_ptr Channel::CreateServer( Channel::~Channel() { } +// static +void Channel::SetMessageVerifier(MessageVerifier verifier) { + g_message_verifier = verifier; +} + +// static +Channel::MessageVerifier Channel::GetMessageVerifier() { + return g_message_verifier; +} + bool Channel::IsSendThreadSafe() const { return false; } diff --git a/ipc/ipc_channel_reader.cc b/ipc/ipc_channel_reader.cc index e1cdc47..0783df7 100644 --- a/ipc/ipc_channel_reader.cc +++ b/ipc/ipc_channel_reader.cc @@ -12,6 +12,7 @@ #include "ipc/ipc_message.h" #include "ipc/ipc_message_attachment_set.h" #include "ipc/ipc_message_macros.h" +#include "ipc/ipc_message_start.h" namespace IPC { namespace internal { @@ -163,6 +164,11 @@ bool ChannelReader::TranslateInputData(const char* input_data, bool ChannelReader::HandleTranslatedMessage( Message* translated_message, const AttachmentIdVector& attachment_ids) { + // TODO(erikchen): Temporary code to help track http://crbug.com/527588. + Channel::MessageVerifier verifier = Channel::GetMessageVerifier(); + if (verifier) + verifier(translated_message); + // Immediately handle internal messages. if (IsInternalMessage(*translated_message)) { EmitLogBeforeDispatch(*translated_message); diff --git a/ipc/ipc_channel_win.cc b/ipc/ipc_channel_win.cc index 19f7cb5..a9079ef 100644 --- a/ipc/ipc_channel_win.cc +++ b/ipc/ipc_channel_win.cc @@ -489,6 +489,17 @@ bool ChannelWin::ProcessOutgoingMessages( // Write to pipe... OutputElement* element = output_queue_.front(); + + // TODO(erikchen): Temporary code to help track http://crbug.com/527588. + { + const Message* m = element->get_message(); + if (m) { + Channel::MessageVerifier verifier = Channel::GetMessageVerifier(); + if (verifier) + verifier(m); + } + } + DCHECK(element->size() <= INT_MAX); BOOL ok = WriteFile(pipe_.Get(), element->data(), -- cgit v1.1