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

Side by Side Diff: mojo/edk/system/node_channel.cc

Issue 2043713004: Mojo: Add NotifyBadMessage API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: no bindings Created 4 years, 6 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 unified diff | Download patch
« no previous file with comments | « mojo/edk/system/node_channel.h ('k') | mojo/edk/system/node_controller.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/edk/system/node_channel.h" 5 #include "mojo/edk/system/node_channel.h"
6 6
7 #include <cstring> 7 #include <cstring>
8 #include <limits> 8 #include <limits>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 26 matching lines...) Expand all
37 BROKER_CLIENT_ADDED, 37 BROKER_CLIENT_ADDED,
38 ACCEPT_BROKER_CLIENT, 38 ACCEPT_BROKER_CLIENT,
39 PORTS_MESSAGE, 39 PORTS_MESSAGE,
40 REQUEST_PORT_MERGE, 40 REQUEST_PORT_MERGE,
41 REQUEST_INTRODUCTION, 41 REQUEST_INTRODUCTION,
42 INTRODUCE, 42 INTRODUCE,
43 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) 43 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
44 RELAY_PORTS_MESSAGE, 44 RELAY_PORTS_MESSAGE,
45 #endif 45 #endif
46 BROADCAST, 46 BROADCAST,
47 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
48 PORTS_MESSAGE_FROM_RELAY,
49 #endif
47 }; 50 };
48 51
49 struct Header { 52 struct Header {
50 MessageType type; 53 MessageType type;
51 uint32_t padding; 54 uint32_t padding;
52 }; 55 };
53 56
54 static_assert(sizeof(Header) % kChannelMessageAlignment == 0, 57 static_assert(sizeof(Header) % kChannelMessageAlignment == 0,
55 "Invalid header size."); 58 "Invalid header size.");
56 59
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 // cannot be introduced. 108 // cannot be introduced.
106 struct IntroductionData { 109 struct IntroductionData {
107 ports::NodeName name; 110 ports::NodeName name;
108 }; 111 };
109 112
110 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) 113 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
111 // This struct is followed by the full payload of a message to be relayed. 114 // This struct is followed by the full payload of a message to be relayed.
112 struct RelayPortsMessageData { 115 struct RelayPortsMessageData {
113 ports::NodeName destination; 116 ports::NodeName destination;
114 }; 117 };
118
119 // This struct is followed by the full payload of a relayed message.
120 struct PortsMessageFromRelayData {
121 ports::NodeName source;
122 };
115 #endif 123 #endif
116 124
117 template <typename DataType> 125 template <typename DataType>
118 Channel::MessagePtr CreateMessage(MessageType type, 126 Channel::MessagePtr CreateMessage(MessageType type,
119 size_t payload_size, 127 size_t payload_size,
120 size_t num_handles, 128 size_t num_handles,
121 DataType** out_data) { 129 DataType** out_data) {
122 Channel::MessagePtr message( 130 Channel::MessagePtr message(
123 new Channel::Message(sizeof(Header) + payload_size, num_handles)); 131 new Channel::Message(sizeof(Header) + payload_size, num_handles));
124 Header* header = reinterpret_cast<Header*>(message->mutable_payload()); 132 Header* header = reinterpret_cast<Header*>(message->mutable_payload());
(...skipping 14 matching lines...) Expand all
139 static_cast<const char*>(bytes) + sizeof(Header)); 147 static_cast<const char*>(bytes) + sizeof(Header));
140 return true; 148 return true;
141 } 149 }
142 150
143 } // namespace 151 } // namespace
144 152
145 // static 153 // static
146 scoped_refptr<NodeChannel> NodeChannel::Create( 154 scoped_refptr<NodeChannel> NodeChannel::Create(
147 Delegate* delegate, 155 Delegate* delegate,
148 ScopedPlatformHandle platform_handle, 156 ScopedPlatformHandle platform_handle,
149 scoped_refptr<base::TaskRunner> io_task_runner) { 157 scoped_refptr<base::TaskRunner> io_task_runner,
158 const ProcessErrorCallback& process_error_callback) {
150 #if defined(OS_NACL) 159 #if defined(OS_NACL)
151 LOG(FATAL) << "Multi-process not yet supported on NaCl"; 160 LOG(FATAL) << "Multi-process not yet supported on NaCl";
152 return nullptr; 161 return nullptr;
153 #else 162 #else
154 return new NodeChannel(delegate, std::move(platform_handle), io_task_runner); 163 return new NodeChannel(delegate, std::move(platform_handle), io_task_runner,
164 process_error_callback);
155 #endif 165 #endif
156 } 166 }
157 167
158 // static 168 // static
159 Channel::MessagePtr NodeChannel::CreatePortsMessage(size_t payload_size, 169 Channel::MessagePtr NodeChannel::CreatePortsMessage(size_t payload_size,
160 void** payload, 170 void** payload,
161 size_t num_handles) { 171 size_t num_handles) {
162 return CreateMessage(MessageType::PORTS_MESSAGE, payload_size, num_handles, 172 return CreateMessage(MessageType::PORTS_MESSAGE, payload_size, num_handles,
163 payload); 173 payload);
164 } 174 }
(...skipping 26 matching lines...) Expand all
191 relay->RemoveObserver(this); 201 relay->RemoveObserver(this);
192 #endif 202 #endif
193 203
194 base::AutoLock lock(channel_lock_); 204 base::AutoLock lock(channel_lock_);
195 if (channel_) { 205 if (channel_) {
196 channel_->ShutDown(); 206 channel_->ShutDown();
197 channel_ = nullptr; 207 channel_ = nullptr;
198 } 208 }
199 } 209 }
200 210
211 void NodeChannel::NotifyBadMessage(const std::string& error) {
212 if (!process_error_callback_.is_null())
213 process_error_callback_.Run("Received bad user message: " + error);
214 }
215
201 void NodeChannel::SetRemoteProcessHandle(base::ProcessHandle process_handle) { 216 void NodeChannel::SetRemoteProcessHandle(base::ProcessHandle process_handle) {
202 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 217 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
203 base::AutoLock lock(remote_process_handle_lock_); 218 base::AutoLock lock(remote_process_handle_lock_);
204 CHECK_NE(remote_process_handle_, base::GetCurrentProcessHandle()); 219 CHECK_NE(remote_process_handle_, base::GetCurrentProcessHandle());
205 remote_process_handle_ = process_handle; 220 remote_process_handle_ = process_handle;
206 } 221 }
207 222
208 bool NodeChannel::HasRemoteProcessHandle() { 223 bool NodeChannel::HasRemoteProcessHandle() {
209 base::AutoLock lock(remote_process_handle_lock_); 224 base::AutoLock lock(remote_process_handle_lock_);
210 return remote_process_handle_ != base::kNullProcessHandle; 225 return remote_process_handle_ != base::kNullProcessHandle;
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 RelayPortsMessageData* data; 388 RelayPortsMessageData* data;
374 Channel::MessagePtr relay_message = CreateMessage( 389 Channel::MessagePtr relay_message = CreateMessage(
375 MessageType::RELAY_PORTS_MESSAGE, num_bytes, handles->size(), &data); 390 MessageType::RELAY_PORTS_MESSAGE, num_bytes, handles->size(), &data);
376 data->destination = destination; 391 data->destination = destination;
377 memcpy(data + 1, message->data(), message->data_num_bytes()); 392 memcpy(data + 1, message->data(), message->data_num_bytes());
378 relay_message->SetHandles(std::move(handles)); 393 relay_message->SetHandles(std::move(handles));
379 #endif // defined(OS_WIN) 394 #endif // defined(OS_WIN)
380 395
381 WriteChannelMessage(std::move(relay_message)); 396 WriteChannelMessage(std::move(relay_message));
382 } 397 }
398
399 void NodeChannel::PortsMessageFromRelay(const ports::NodeName& source,
400 Channel::MessagePtr message) {
401 size_t num_bytes = sizeof(PortsMessageFromRelayData) +
402 message->payload_size();
403 PortsMessageFromRelayData* data;
404 Channel::MessagePtr relayed_message = CreateMessage(
405 MessageType::PORTS_MESSAGE_FROM_RELAY, num_bytes, message->num_handles(),
406 &data);
407 data->source = source;
408 if (message->payload_size())
409 memcpy(data + 1, message->payload(), message->payload_size());
410 relayed_message->SetHandles(message->TakeHandles());
411 WriteChannelMessage(std::move(relayed_message));
412 }
383 #endif // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) 413 #endif // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
384 414
385 NodeChannel::NodeChannel(Delegate* delegate, 415 NodeChannel::NodeChannel(Delegate* delegate,
386 ScopedPlatformHandle platform_handle, 416 ScopedPlatformHandle platform_handle,
387 scoped_refptr<base::TaskRunner> io_task_runner) 417 scoped_refptr<base::TaskRunner> io_task_runner,
418 const ProcessErrorCallback& process_error_callback)
388 : delegate_(delegate), 419 : delegate_(delegate),
389 io_task_runner_(io_task_runner) 420 io_task_runner_(io_task_runner),
421 process_error_callback_(process_error_callback)
390 #if !defined(OS_NACL) 422 #if !defined(OS_NACL)
391 , channel_( 423 , channel_(
392 Channel::Create(this, std::move(platform_handle), io_task_runner_)) 424 Channel::Create(this, std::move(platform_handle), io_task_runner_))
393 #endif 425 #endif
394 { 426 {
395 } 427 }
396 428
397 NodeChannel::~NodeChannel() { 429 NodeChannel::~NodeChannel() {
398 ShutDown(); 430 ShutDown();
399 } 431 }
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 } 668 }
637 #endif 669 #endif
638 670
639 case MessageType::BROADCAST: 671 case MessageType::BROADCAST:
640 // This is here as a placeholder for now because nothing sends a BROADCAST 672 // This is here as a placeholder for now because nothing sends a BROADCAST
641 // message yet. This avoids breakage on version skew (namely for ARC) when 673 // message yet. This avoids breakage on version skew (namely for ARC) when
642 // we actually begin using the message. 674 // we actually begin using the message.
643 DVLOG(1) << "Ignoring unhandled BROADCAST message."; 675 DVLOG(1) << "Ignoring unhandled BROADCAST message.";
644 return; 676 return;
645 677
678 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
679 case MessageType::PORTS_MESSAGE_FROM_RELAY:
680 const PortsMessageFromRelayData* data;
681 if (GetMessagePayload(payload, payload_size, &data)) {
682 size_t num_bytes = payload_size - sizeof(*data);
683 if (num_bytes < sizeof(Header))
684 break;
685 num_bytes -= sizeof(Header);
686
687 size_t num_handles = handles ? handles->size() : 0;
688 Channel::MessagePtr message(
689 new Channel::Message(num_bytes, num_handles));
690 message->SetHandles(std::move(handles));
691 if (num_bytes)
692 memcpy(message->mutable_payload(), data + 1, num_bytes);
693 delegate_->OnPortsMessageFromRelay(
694 remote_node_name_, data->source, std::move(message));
695 return;
696 }
697 break;
698
699 #endif // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
700
646 default: 701 default:
647 break; 702 break;
648 } 703 }
649 704
650 DLOG(ERROR) << "Received invalid message. Closing channel."; 705 DLOG(ERROR) << "Received invalid message. Closing channel.";
651 delegate_->OnChannelError(remote_node_name_); 706 delegate_->OnChannelError(remote_node_name_);
652 } 707 }
653 708
654 void NodeChannel::OnChannelError() { 709 void NodeChannel::OnChannelError() {
655 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 710 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 837
783 base::AutoLock lock(channel_lock_); 838 base::AutoLock lock(channel_lock_);
784 if (!channel_) 839 if (!channel_)
785 DLOG(ERROR) << "Dropping message on closed channel."; 840 DLOG(ERROR) << "Dropping message on closed channel.";
786 else 841 else
787 channel_->Write(std::move(message)); 842 channel_->Write(std::move(message));
788 } 843 }
789 844
790 } // namespace edk 845 } // namespace edk
791 } // namespace mojo 846 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/node_channel.h ('k') | mojo/edk/system/node_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698