Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Unified Diff: mojo/edk/system/node_channel.cc

Issue 1975073002: [mojo-edk] Broadcast surprise port disruptions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@reenable-clean-shutdown
Patch Set: rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/edk/system/node_channel.cc
diff --git a/mojo/edk/system/node_channel.cc b/mojo/edk/system/node_channel.cc
index 885750d66786674d008f5f75e7b65d54a99240ca..22d97e266e9004491fcebe139a91a76d53a8eec7 100644
--- a/mojo/edk/system/node_channel.cc
+++ b/mojo/edk/system/node_channel.cc
@@ -39,6 +39,7 @@ enum class MessageType : uint32_t {
REQUEST_PORT_MERGE,
REQUEST_INTRODUCTION,
INTRODUCE,
+ BROADCAST,
#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
RELAY_PORTS_MESSAGE,
#endif
@@ -329,6 +330,15 @@ void NodeChannel::Introduce(const ports::NodeName& name,
WriteChannelMessage(std::move(message));
}
+void NodeChannel::Broadcast(Channel::MessagePtr message) {
+ DCHECK(!message->has_handles());
+ void* data;
+ Channel::MessagePtr broadcast_message = CreateMessage(
+ MessageType::BROADCAST, message->data_num_bytes(), 0, &data);
+ memcpy(data, message->data(), message->data_num_bytes());
+ WriteChannelMessage(std::move(broadcast_message));
+}
+
#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
void NodeChannel::RelayPortsMessage(const ports::NodeName& destination,
Channel::MessagePtr message) {
@@ -574,6 +584,21 @@ void NodeChannel::OnChannelMessage(const void* payload,
break;
}
+ case MessageType::BROADCAST: {
+ if (payload_size <= sizeof(Header))
+ break;
+ const void* data = static_cast<const void*>(
+ reinterpret_cast<const Header*>(payload) + 1);
+ Channel::MessagePtr message =
+ Channel::Message::Deserialize(data, payload_size - sizeof(Header));
+ if (!message) {
+ DLOG(ERROR) << "Dropping invalid broadcast message.";
+ break;
+ }
+ delegate_->OnBroadcast(std::move(message));
+ return;
+ }
+
#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
case MessageType::RELAY_PORTS_MESSAGE: {
base::ProcessHandle from_process;

Powered by Google App Engine
This is Rietveld 408576698