summaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authorerikchen <erikchen@chromium.org>2015-12-07 13:00:48 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-07 21:02:09 +0000
commitee68563f8c5c4781a26b0f2f5dc310cbd6aa950d (patch)
treee69d16e641b2de3b82e582a93e28a8534bdd8da3 /ipc
parent8be77127d9f6768d40093305379ce0f6c05a3bc6 (diff)
downloadchromium_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.h5
-rw-r--r--ipc/ipc_channel_common.cc12
-rw-r--r--ipc/ipc_channel_reader.cc6
-rw-r--r--ipc/ipc_channel_win.cc11
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(),