diff options
author | erikchen <erikchen@chromium.org> | 2015-12-07 13:00:48 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-07 21:02:09 +0000 |
commit | ee68563f8c5c4781a26b0f2f5dc310cbd6aa950d (patch) | |
tree | e69d16e641b2de3b82e582a93e28a8534bdd8da3 /ipc | |
parent | 8be77127d9f6768d40093305379ce0f6c05a3bc6 (diff) | |
download | chromium_src-ee68563f8c5c4781a26b0f2f5dc310cbd6aa950d.zip chromium_src-ee68563f8c5c4781a26b0f2f5dc310cbd6aa950d.tar.gz chromium_src-ee68563f8c5c4781a26b0f2f5dc310cbd6aa950d.tar.bz2 |
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}
Diffstat (limited to 'ipc')
-rw-r--r-- | ipc/ipc_channel.h | 5 | ||||
-rw-r--r-- | ipc/ipc_channel_common.cc | 12 | ||||
-rw-r--r-- | ipc/ipc_channel_reader.cc | 6 | ||||
-rw-r--r-- | ipc/ipc_channel_win.cc | 11 |
4 files changed, 34 insertions, 0 deletions
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> Channel::CreateClient( const IPC::ChannelHandle& channel_handle, @@ -47,6 +49,16 @@ scoped_ptr<Channel> 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(), |