OLD | NEW |
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 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "mojo/edk/system/channel.h" | 12 #include "mojo/edk/system/channel.h" |
| 13 #include "mojo/edk/system/request_context.h" |
13 | 14 |
14 namespace mojo { | 15 namespace mojo { |
15 namespace edk { | 16 namespace edk { |
16 | 17 |
17 namespace { | 18 namespace { |
18 | 19 |
19 template <typename T> | 20 template <typename T> |
20 T Align(T t) { | 21 T Align(T t) { |
21 const auto k = kChannelMessageAlignment; | 22 const auto k = kChannelMessageAlignment; |
22 return t + (k - (t % k)) % k; | 23 return t + (k - (t % k)) % k; |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 | 341 |
341 NodeChannel::~NodeChannel() { | 342 NodeChannel::~NodeChannel() { |
342 ShutDown(); | 343 ShutDown(); |
343 } | 344 } |
344 | 345 |
345 void NodeChannel::OnChannelMessage(const void* payload, | 346 void NodeChannel::OnChannelMessage(const void* payload, |
346 size_t payload_size, | 347 size_t payload_size, |
347 ScopedPlatformHandleVectorPtr handles) { | 348 ScopedPlatformHandleVectorPtr handles) { |
348 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 349 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
349 | 350 |
| 351 RequestContext request_context(RequestContext::Source::SYSTEM); |
| 352 |
350 #if defined(OS_WIN) | 353 #if defined(OS_WIN) |
351 // If we receive handles from a known process, rewrite them to our own | 354 // If we receive handles from a known process, rewrite them to our own |
352 // process. This can occur when a privileged node receives handles directly | 355 // process. This can occur when a privileged node receives handles directly |
353 // from a privileged descendant. | 356 // from a privileged descendant. |
354 { | 357 { |
355 base::AutoLock lock(remote_process_handle_lock_); | 358 base::AutoLock lock(remote_process_handle_lock_); |
356 if (handles && remote_process_handle_ != base::kNullProcessHandle) { | 359 if (handles && remote_process_handle_ != base::kNullProcessHandle) { |
357 if (!Channel::Message::RewriteHandles(remote_process_handle_, | 360 if (!Channel::Message::RewriteHandles(remote_process_handle_, |
358 base::GetCurrentProcessHandle(), | 361 base::GetCurrentProcessHandle(), |
359 handles->data(), handles->size())) { | 362 handles->data(), handles->size())) { |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 << static_cast<uint32_t>(header->type) << " from node " | 514 << static_cast<uint32_t>(header->type) << " from node " |
512 << remote_node_name_; | 515 << remote_node_name_; |
513 delegate_->OnChannelError(remote_node_name_); | 516 delegate_->OnChannelError(remote_node_name_); |
514 break; | 517 break; |
515 } | 518 } |
516 } | 519 } |
517 | 520 |
518 void NodeChannel::OnChannelError() { | 521 void NodeChannel::OnChannelError() { |
519 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 522 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
520 | 523 |
| 524 RequestContext request_context(RequestContext::Source::SYSTEM); |
| 525 |
521 ShutDown(); | 526 ShutDown(); |
522 // |OnChannelError()| may cause |this| to be destroyed, but still need access | 527 // |OnChannelError()| may cause |this| to be destroyed, but still need access |
523 // to the name name after that destruction. So may a copy of | 528 // to the name name after that destruction. So may a copy of |
524 // |remote_node_name_| so it can be used if |this| becomes destroyed. | 529 // |remote_node_name_| so it can be used if |this| becomes destroyed. |
525 ports::NodeName node_name = remote_node_name_; | 530 ports::NodeName node_name = remote_node_name_; |
526 delegate_->OnChannelError(node_name); | 531 delegate_->OnChannelError(node_name); |
527 } | 532 } |
528 | 533 |
529 void NodeChannel::WriteChannelMessage(Channel::MessagePtr message) { | 534 void NodeChannel::WriteChannelMessage(Channel::MessagePtr message) { |
530 #if defined(OS_WIN) | 535 #if defined(OS_WIN) |
(...skipping 23 matching lines...) Expand all Loading... |
554 | 559 |
555 base::AutoLock lock(channel_lock_); | 560 base::AutoLock lock(channel_lock_); |
556 if (!channel_) | 561 if (!channel_) |
557 DLOG(ERROR) << "Dropping message on closed channel."; | 562 DLOG(ERROR) << "Dropping message on closed channel."; |
558 else | 563 else |
559 channel_->Write(std::move(message)); | 564 channel_->Write(std::move(message)); |
560 } | 565 } |
561 | 566 |
562 } // namespace edk | 567 } // namespace edk |
563 } // namespace mojo | 568 } // namespace mojo |
OLD | NEW |