| Index: ipc/attachment_broker_privileged_win.cc
 | 
| diff --git a/ipc/attachment_broker_privileged_win.cc b/ipc/attachment_broker_privileged_win.cc
 | 
| deleted file mode 100644
 | 
| index ca7f9c6707672f140cdbcbcb42062f03ede0c594..0000000000000000000000000000000000000000
 | 
| --- a/ipc/attachment_broker_privileged_win.cc
 | 
| +++ /dev/null
 | 
| @@ -1,184 +0,0 @@
 | 
| -// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include "ipc/attachment_broker_privileged_win.h"
 | 
| -
 | 
| -#include <windows.h>
 | 
| -
 | 
| -#include <tuple>
 | 
| -
 | 
| -#include "base/process/process.h"
 | 
| -#include "ipc/attachment_broker_messages.h"
 | 
| -#include "ipc/brokerable_attachment.h"
 | 
| -#include "ipc/handle_attachment_win.h"
 | 
| -#include "ipc/ipc_channel.h"
 | 
| -
 | 
| -namespace IPC {
 | 
| -
 | 
| -AttachmentBrokerPrivilegedWin::AttachmentBrokerPrivilegedWin() {}
 | 
| -
 | 
| -AttachmentBrokerPrivilegedWin::~AttachmentBrokerPrivilegedWin() {}
 | 
| -
 | 
| -bool AttachmentBrokerPrivilegedWin::SendAttachmentToProcess(
 | 
| -    const scoped_refptr<IPC::BrokerableAttachment>& attachment,
 | 
| -    base::ProcessId destination_process) {
 | 
| -  switch (attachment->GetBrokerableType()) {
 | 
| -    case BrokerableAttachment::WIN_HANDLE: {
 | 
| -      internal::HandleAttachmentWin* handle_attachment =
 | 
| -          static_cast<internal::HandleAttachmentWin*>(attachment.get());
 | 
| -      HandleWireFormat wire_format =
 | 
| -          handle_attachment->GetWireFormat(destination_process);
 | 
| -      HandleWireFormat new_wire_format =
 | 
| -          DuplicateWinHandle(wire_format, base::Process::Current().Pid());
 | 
| -      handle_attachment->reset_handle_ownership();
 | 
| -      if (new_wire_format.handle == 0)
 | 
| -        return false;
 | 
| -      RouteDuplicatedHandle(new_wire_format, true);
 | 
| -      return true;
 | 
| -    }
 | 
| -    case BrokerableAttachment::MACH_PORT:
 | 
| -    case BrokerableAttachment::PLACEHOLDER:
 | 
| -      NOTREACHED();
 | 
| -      return false;
 | 
| -  }
 | 
| -  return false;
 | 
| -}
 | 
| -
 | 
| -void AttachmentBrokerPrivilegedWin::ReceivedPeerPid(base::ProcessId peer_pid) {
 | 
| -  auto it = stored_wire_formats_.find(peer_pid);
 | 
| -  if (it == stored_wire_formats_.end())
 | 
| -    return;
 | 
| -
 | 
| -  // Make a copy, and destroy the original.
 | 
| -  WireFormats wire_formats = it->second;
 | 
| -  stored_wire_formats_.erase(it);
 | 
| -
 | 
| -  for (const HandleWireFormat& format : wire_formats) {
 | 
| -    RouteDuplicatedHandle(format, false);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -bool AttachmentBrokerPrivilegedWin::OnMessageReceived(const Message& msg) {
 | 
| -  bool handled = true;
 | 
| -  switch (msg.type()) {
 | 
| -    IPC_MESSAGE_HANDLER_GENERIC(AttachmentBrokerMsg_DuplicateWinHandle,
 | 
| -                                OnDuplicateWinHandle(msg))
 | 
| -    IPC_MESSAGE_UNHANDLED(handled = false)
 | 
| -  }
 | 
| -  return handled;
 | 
| -}
 | 
| -
 | 
| -void AttachmentBrokerPrivilegedWin::OnDuplicateWinHandle(
 | 
| -    const IPC::Message& message) {
 | 
| -  AttachmentBrokerMsg_DuplicateWinHandle::Param param;
 | 
| -  if (!AttachmentBrokerMsg_DuplicateWinHandle::Read(&message, ¶m))
 | 
| -    return;
 | 
| -  IPC::internal::HandleAttachmentWin::WireFormat wire_format =
 | 
| -      std::get<0>(param);
 | 
| -
 | 
| -  if (wire_format.destination_process == base::kNullProcessId) {
 | 
| -    LogError(NO_DESTINATION);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  HandleWireFormat new_wire_format =
 | 
| -      DuplicateWinHandle(wire_format, message.get_sender_pid());
 | 
| -  RouteDuplicatedHandle(new_wire_format, true);
 | 
| -}
 | 
| -
 | 
| -void AttachmentBrokerPrivilegedWin::RouteDuplicatedHandle(
 | 
| -    const HandleWireFormat& wire_format,
 | 
| -    bool store_on_failure) {
 | 
| -  // This process is the destination.
 | 
| -  if (wire_format.destination_process == base::Process::Current().Pid()) {
 | 
| -    scoped_refptr<BrokerableAttachment> attachment(
 | 
| -        new internal::HandleAttachmentWin(wire_format));
 | 
| -    HandleReceivedAttachment(attachment);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // Another process is the destination.
 | 
| -  base::ProcessId dest = wire_format.destination_process;
 | 
| -  base::AutoLock auto_lock(*get_lock());
 | 
| -  AttachmentBrokerPrivileged::EndpointRunnerPair pair =
 | 
| -      GetSenderWithProcessId(dest);
 | 
| -  if (!pair.first) {
 | 
| -    if (store_on_failure) {
 | 
| -      LogError(DELAYED);
 | 
| -      stored_wire_formats_[dest].push_back(wire_format);
 | 
| -    } else {
 | 
| -      // Assuming that this message was not sent from a malicious process, the
 | 
| -      // channel endpoint that would have received this message will block
 | 
| -      // forever.
 | 
| -      LOG(ERROR)
 | 
| -          << "Failed to deliver brokerable attachment to process with id: "
 | 
| -          << dest;
 | 
| -      LogError(DESTINATION_NOT_FOUND);
 | 
| -    }
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  LogError(DESTINATION_FOUND);
 | 
| -  if (!store_on_failure)
 | 
| -    LogError(DELAYED_SEND);
 | 
| -
 | 
| -  SendMessageToEndpoint(
 | 
| -      pair, new AttachmentBrokerMsg_WinHandleHasBeenDuplicated(wire_format));
 | 
| -}
 | 
| -
 | 
| -AttachmentBrokerPrivilegedWin::HandleWireFormat
 | 
| -AttachmentBrokerPrivilegedWin::DuplicateWinHandle(
 | 
| -    const HandleWireFormat& wire_format,
 | 
| -    base::ProcessId source_pid) {
 | 
| -  // If the source process is the destination process, then no additional work
 | 
| -  // is required.
 | 
| -  if (source_pid == wire_format.destination_process)
 | 
| -    return wire_format;
 | 
| -
 | 
| -  // If the handle is not valid, no additional work is required.
 | 
| -  if (wire_format.handle == 0)
 | 
| -    return wire_format;
 | 
| -
 | 
| -  base::Process source_process =
 | 
| -      base::Process::OpenWithExtraPrivileges(source_pid);
 | 
| -  base::Process dest_process =
 | 
| -      base::Process::OpenWithExtraPrivileges(wire_format.destination_process);
 | 
| -  if (!source_process.Handle() || !dest_process.Handle()) {
 | 
| -    LogError(ERROR_COULD_NOT_OPEN_SOURCE_OR_DEST);
 | 
| -    return wire_format;
 | 
| -  }
 | 
| -
 | 
| -  DWORD desired_access = 0;
 | 
| -  DWORD options = DUPLICATE_CLOSE_SOURCE;
 | 
| -  switch (wire_format.permissions) {
 | 
| -    case HandleWin::INVALID:
 | 
| -      LogError(ERROR_INVALID_PERMISSIONS);
 | 
| -      return CopyWireFormat(wire_format, 0);
 | 
| -    case HandleWin::DUPLICATE:
 | 
| -      options |= DUPLICATE_SAME_ACCESS;
 | 
| -      break;
 | 
| -    case HandleWin::FILE_READ_WRITE:
 | 
| -      desired_access = FILE_GENERIC_READ | FILE_GENERIC_WRITE;
 | 
| -      break;
 | 
| -  }
 | 
| -
 | 
| -  HANDLE new_handle;
 | 
| -  HANDLE original_handle = LongToHandle(wire_format.handle);
 | 
| -  DWORD result = ::DuplicateHandle(source_process.Handle(), original_handle,
 | 
| -                                   dest_process.Handle(), &new_handle,
 | 
| -                                   desired_access, FALSE, options);
 | 
| -
 | 
| -  int new_wire_format_handle = (result != 0) ? HandleToLong(new_handle) : 0;
 | 
| -  return CopyWireFormat(wire_format, new_wire_format_handle);
 | 
| -}
 | 
| -
 | 
| -AttachmentBrokerPrivilegedWin::HandleWireFormat
 | 
| -AttachmentBrokerPrivilegedWin::CopyWireFormat(
 | 
| -    const HandleWireFormat& wire_format,
 | 
| -    int handle) {
 | 
| -  return HandleWireFormat(handle, wire_format.destination_process,
 | 
| -                          wire_format.permissions, wire_format.attachment_id);
 | 
| -}
 | 
| -
 | 
| -}  // namespace IPC
 | 
| 
 |