| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ipc/ipc_channel_win.h" | 5 #include "ipc/ipc_channel_win.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 memset(&context.overlapped, 0, sizeof(context.overlapped)); | 27 memset(&context.overlapped, 0, sizeof(context.overlapped)); |
| 28 context.handler = channel; | 28 context.handler = channel; |
| 29 } | 29 } |
| 30 | 30 |
| 31 ChannelWin::State::~State() { | 31 ChannelWin::State::~State() { |
| 32 static_assert(offsetof(ChannelWin::State, context) == 0, | 32 static_assert(offsetof(ChannelWin::State, context) == 0, |
| 33 "ChannelWin::State should have context as its first data" | 33 "ChannelWin::State should have context as its first data" |
| 34 "member."); | 34 "member."); |
| 35 } | 35 } |
| 36 | 36 |
| 37 ChannelWin::ChannelWin(const IPC::ChannelHandle &channel_handle, | 37 ChannelWin::ChannelWin(const IPC::ChannelHandle& channel_handle, |
| 38 Mode mode, Listener* listener) | 38 Mode mode, |
| 39 Listener* listener, |
| 40 AttachmentBroker* broker) |
| 39 : ChannelReader(listener), | 41 : ChannelReader(listener), |
| 40 input_state_(this), | 42 input_state_(this), |
| 41 output_state_(this), | 43 output_state_(this), |
| 42 peer_pid_(base::kNullProcessId), | 44 peer_pid_(base::kNullProcessId), |
| 43 waiting_connect_(mode & MODE_SERVER_FLAG), | 45 waiting_connect_(mode & MODE_SERVER_FLAG), |
| 44 processing_incoming_(false), | 46 processing_incoming_(false), |
| 45 validate_client_(false), | 47 validate_client_(false), |
| 46 client_secret_(0), | 48 client_secret_(0), |
| 47 weak_factory_(this) { | 49 weak_factory_(this), |
| 50 broker_(broker) { |
| 48 CreatePipe(channel_handle, mode); | 51 CreatePipe(channel_handle, mode); |
| 49 } | 52 } |
| 50 | 53 |
| 51 ChannelWin::~ChannelWin() { | 54 ChannelWin::~ChannelWin() { |
| 52 Close(); | 55 Close(); |
| 53 } | 56 } |
| 54 | 57 |
| 55 void ChannelWin::Close() { | 58 void ChannelWin::Close() { |
| 56 if (thread_check_.get()) | 59 if (thread_check_.get()) |
| 57 DCHECK(thread_check_->CalledOnValidThread()); | 60 DCHECK(thread_check_->CalledOnValidThread()); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 if (!waiting_connect_) { | 97 if (!waiting_connect_) { |
| 95 if (!output_state_.is_pending) { | 98 if (!output_state_.is_pending) { |
| 96 if (!ProcessOutgoingMessages(NULL, 0)) | 99 if (!ProcessOutgoingMessages(NULL, 0)) |
| 97 return false; | 100 return false; |
| 98 } | 101 } |
| 99 } | 102 } |
| 100 | 103 |
| 101 return true; | 104 return true; |
| 102 } | 105 } |
| 103 | 106 |
| 107 AttachmentBroker* ChannelWin::GetAttachmentBroker() { |
| 108 return broker_; |
| 109 } |
| 110 |
| 104 base::ProcessId ChannelWin::GetPeerPID() const { | 111 base::ProcessId ChannelWin::GetPeerPID() const { |
| 105 return peer_pid_; | 112 return peer_pid_; |
| 106 } | 113 } |
| 107 | 114 |
| 108 base::ProcessId ChannelWin::GetSelfPID() const { | 115 base::ProcessId ChannelWin::GetSelfPID() const { |
| 109 return GetCurrentProcessId(); | 116 return GetCurrentProcessId(); |
| 110 } | 117 } |
| 111 | 118 |
| 112 // static | 119 // static |
| 113 bool ChannelWin::IsNamedServerInitialized( | 120 bool ChannelWin::IsNamedServerInitialized( |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 // We don't want to re-enter Close(). | 476 // We don't want to re-enter Close(). |
| 470 Close(); | 477 Close(); |
| 471 listener()->OnChannelError(); | 478 listener()->OnChannelError(); |
| 472 } | 479 } |
| 473 } | 480 } |
| 474 | 481 |
| 475 //------------------------------------------------------------------------------ | 482 //------------------------------------------------------------------------------ |
| 476 // Channel's methods | 483 // Channel's methods |
| 477 | 484 |
| 478 // static | 485 // static |
| 479 scoped_ptr<Channel> Channel::Create( | 486 scoped_ptr<Channel> Channel::Create(const IPC::ChannelHandle& channel_handle, |
| 480 const IPC::ChannelHandle &channel_handle, Mode mode, Listener* listener) { | 487 Mode mode, |
| 488 Listener* listener, |
| 489 AttachmentBroker* broker) { |
| 481 return scoped_ptr<Channel>( | 490 return scoped_ptr<Channel>( |
| 482 new ChannelWin(channel_handle, mode, listener)); | 491 new ChannelWin(channel_handle, mode, listener, broker)); |
| 483 } | 492 } |
| 484 | 493 |
| 485 // static | 494 // static |
| 486 bool Channel::IsNamedServerInitialized(const std::string& channel_id) { | 495 bool Channel::IsNamedServerInitialized(const std::string& channel_id) { |
| 487 return ChannelWin::IsNamedServerInitialized(channel_id); | 496 return ChannelWin::IsNamedServerInitialized(channel_id); |
| 488 } | 497 } |
| 489 | 498 |
| 490 // static | 499 // static |
| 491 std::string Channel::GenerateVerifiedChannelID(const std::string& prefix) { | 500 std::string Channel::GenerateVerifiedChannelID(const std::string& prefix) { |
| 492 // Windows pipes can be enumerated by low-privileged processes. So, we | 501 // Windows pipes can be enumerated by low-privileged processes. So, we |
| 493 // append a strong random value after the \ character. This value is not | 502 // append a strong random value after the \ character. This value is not |
| 494 // included in the pipe name, but sent as part of the client hello, to | 503 // included in the pipe name, but sent as part of the client hello, to |
| 495 // hijacking the pipe name to spoof the client. | 504 // hijacking the pipe name to spoof the client. |
| 496 | 505 |
| 497 std::string id = prefix; | 506 std::string id = prefix; |
| 498 if (!id.empty()) | 507 if (!id.empty()) |
| 499 id.append("."); | 508 id.append("."); |
| 500 | 509 |
| 501 int secret; | 510 int secret; |
| 502 do { // Guarantee we get a non-zero value. | 511 do { // Guarantee we get a non-zero value. |
| 503 secret = base::RandInt(0, std::numeric_limits<int>::max()); | 512 secret = base::RandInt(0, std::numeric_limits<int>::max()); |
| 504 } while (secret == 0); | 513 } while (secret == 0); |
| 505 | 514 |
| 506 id.append(GenerateUniqueRandomChannelID()); | 515 id.append(GenerateUniqueRandomChannelID()); |
| 507 return id.append(base::StringPrintf("\\%d", secret)); | 516 return id.append(base::StringPrintf("\\%d", secret)); |
| 508 } | 517 } |
| 509 | 518 |
| 510 } // namespace IPC | 519 } // namespace IPC |
| OLD | NEW |