IPC: Fix attachment brokering race condition.
A channel must be registered as a broker communication channel before it is
connected. When possible, invert the sequence of the call to connect a channel,
and the call to register the channel as a broker. In some cases, the channel
constructor and the channel initializer had to be separated, so that the
registration could happen in between.
This requirement is now enforced by a CHECK, which verifies that a channel
cannot be registered after it is connected.
BUG=598088
Review URL: https://codereview.chromium.org/1903663004
Cr-Commit-Position: refs/heads/master@{#389618}
diff --git a/ipc/attachment_broker_privileged_win_unittest.cc b/ipc/attachment_broker_privileged_win_unittest.cc
index dc3bffc..3c8df8e 100644
--- a/ipc/attachment_broker_privileged_win_unittest.cc
+++ b/ipc/attachment_broker_privileged_win_unittest.cc
@@ -265,11 +265,21 @@
}
void CommonSetUp() {
+ PreConnectSetUp();
+ PostConnectSetUp();
+ }
+
+ // All of setup before the channel is connected.
+ void PreConnectSetUp() {
if (!broker_.get())
set_broker(new IPC::AttachmentBrokerUnprivilegedWin);
broker_->AddObserver(&observer_, task_runner());
CreateChannel(&proxy_listener_);
broker_->RegisterBrokerCommunicationChannel(channel());
+ }
+
+ // All of setup including the connection and everything after.
+ void PostConnectSetUp() {
ASSERT_TRUE(ConnectChannel());
ASSERT_TRUE(StartClient());
@@ -390,10 +400,12 @@
Init("SendHandleToSelf");
set_broker(new MockBroker);
- CommonSetUp();
+
+ PreConnectSetUp();
// Technically, the channel is an endpoint, but we need the proxy listener to
// receive the messages so that it can quit the message loop.
channel()->SetAttachmentBrokerEndpoint(false);
+ PostConnectSetUp();
get_proxy_listener()->set_listener(get_broker());
HANDLE h = CreateTempFile();