| Index: ipc/attachment_broker_privileged_mac.h
|
| diff --git a/ipc/attachment_broker_privileged_mac.h b/ipc/attachment_broker_privileged_mac.h
|
| deleted file mode 100644
|
| index 9122a16d8fba38af68ccbb44c04d3d74d4ab5107..0000000000000000000000000000000000000000
|
| --- a/ipc/attachment_broker_privileged_mac.h
|
| +++ /dev/null
|
| @@ -1,220 +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.
|
| -
|
| -#ifndef IPC_ATTACHMENT_BROKER_PRIVILEGED_MAC_H_
|
| -#define IPC_ATTACHMENT_BROKER_PRIVILEGED_MAC_H_
|
| -
|
| -#include <mach/mach.h>
|
| -#include <stdint.h>
|
| -
|
| -#include <map>
|
| -
|
| -#include "base/gtest_prod_util.h"
|
| -#include "base/mac/scoped_mach_port.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/scoped_vector.h"
|
| -#include "base/process/port_provider_mac.h"
|
| -#include "base/synchronization/lock.h"
|
| -#include "ipc/attachment_broker_privileged.h"
|
| -#include "ipc/ipc_export.h"
|
| -#include "ipc/mach_port_attachment_mac.h"
|
| -
|
| -namespace base {
|
| -class PortProvider;
|
| -} // namespace base
|
| -
|
| -namespace IPC {
|
| -
|
| -// This class is a concrete subclass of AttachmentBrokerPrivileged for the
|
| -// OSX platform.
|
| -//
|
| -// An example of the typical process by which a Mach port gets brokered.
|
| -// Definitions:
|
| -// 1. Let there be three processes P1, U2, U3. P1 is privileged.
|
| -// 2. U2 wants to send a Mach port M2 to U3. If this port is inserted into P1,
|
| -// it will be called M1. If it is inserted into U3, it will be called M3.
|
| -// 3. name() returns a serializable representation of a Mach port that can be
|
| -// passed over chrome IPC.
|
| -// 4. pid() returns the process id of a process.
|
| -//
|
| -// Process:
|
| -// 1. U2 sends a AttachmentBrokerMsg_DuplicateMachPort message to P1. The
|
| -// message contains name(M2), and pid(U3).
|
| -// 2. P1 extracts M2 into its own namespace, making M1.
|
| -// 3. P1 makes a new Mach port R in U3.
|
| -// 4. P1 sends a mach_msg with M1 to R.
|
| -// 5. P1 sends name(R) to U3.
|
| -// 6. U3 retrieves the queued message from R. The kernel automatically
|
| -// translates M1 into the namespace of U3, making M3.
|
| -//
|
| -// The logic of this class is a little bit more complex becauese any or all of
|
| -// P1, U2 and U3 may be the same, and depending on the exact configuration,
|
| -// the creation of R may not be necessary.
|
| -//
|
| -// For the rest of this file, and the corresponding implementation file, R will
|
| -// be called the "intermediate Mach port" and M3 the "final Mach port".
|
| -class IPC_EXPORT AttachmentBrokerPrivilegedMac
|
| - : public AttachmentBrokerPrivileged,
|
| - public base::PortProvider::Observer {
|
| - public:
|
| - explicit AttachmentBrokerPrivilegedMac(base::PortProvider* port_provider);
|
| - ~AttachmentBrokerPrivilegedMac() override;
|
| -
|
| - // IPC::AttachmentBroker overrides.
|
| - bool SendAttachmentToProcess(
|
| - const scoped_refptr<IPC::BrokerableAttachment>& attachment,
|
| - base::ProcessId destination_process) override;
|
| - void DeregisterCommunicationChannel(Endpoint* endpoint) override;
|
| - void ReceivedPeerPid(base::ProcessId peer_pid) override;
|
| -
|
| - // IPC::Listener overrides.
|
| - bool OnMessageReceived(const Message& message) override;
|
| -
|
| - // base::PortProvider::Observer override.
|
| - void OnReceivedTaskPort(base::ProcessHandle process) override;
|
| -
|
| - private:
|
| - FRIEND_TEST_ALL_PREFIXES(AttachmentBrokerPrivilegedMacMultiProcessTest,
|
| - InsertRight);
|
| - FRIEND_TEST_ALL_PREFIXES(AttachmentBrokerPrivilegedMacMultiProcessTest,
|
| - InsertSameRightTwice);
|
| - FRIEND_TEST_ALL_PREFIXES(AttachmentBrokerPrivilegedMacMultiProcessTest,
|
| - InsertTwoRights);
|
| - using MachPortWireFormat = internal::MachPortAttachmentMac::WireFormat;
|
| -
|
| - // Contains all the information necessary to broker an attachment into a
|
| - // destination process. The only thing that prevents an AttachmentPrecusor
|
| - // from being immediately processed is if |port_provider_| does not yet have a
|
| - // task port for |pid|.
|
| - class IPC_EXPORT AttachmentPrecursor {
|
| - public:
|
| - AttachmentPrecursor(const base::ProcessId& pid,
|
| - base::mac::ScopedMachSendRight port_to_insert,
|
| - const BrokerableAttachment::AttachmentId& id);
|
| - ~AttachmentPrecursor();
|
| -
|
| - // Caller takes ownership of |port_|.
|
| - base::mac::ScopedMachSendRight TakePort();
|
| -
|
| - base::ProcessId pid() const { return pid_; }
|
| - const BrokerableAttachment::AttachmentId id() const { return id_; }
|
| -
|
| - private:
|
| - // The pid of the destination process.
|
| - const base::ProcessId pid_;
|
| - // The final Mach port, as per definition at the top of this file.
|
| - base::mac::ScopedMachSendRight port_;
|
| - // The id of the attachment.
|
| - const BrokerableAttachment::AttachmentId id_;
|
| - DISALLOW_COPY_AND_ASSIGN(AttachmentPrecursor);
|
| - };
|
| -
|
| - // Contains all the information necessary to extract a send right and create
|
| - // an AttachmentPrecursor. The only thing that prevents an AttachmentExtractor
|
| - // from being immediately processed is if |port_provider_| does not yet have a
|
| - // task port for |source_pid|.
|
| - class IPC_EXPORT AttachmentExtractor {
|
| - public:
|
| - AttachmentExtractor(const base::ProcessId& source_pid,
|
| - const base::ProcessId& dest_pid,
|
| - mach_port_name_t port,
|
| - const BrokerableAttachment::AttachmentId& id);
|
| - ~AttachmentExtractor();
|
| -
|
| - base::ProcessId source_pid() const { return source_pid_; }
|
| - base::ProcessId dest_pid() const { return dest_pid_; }
|
| - mach_port_name_t port() const { return port_to_extract_; }
|
| - const BrokerableAttachment::AttachmentId id() const { return id_; }
|
| -
|
| - private:
|
| - const base::ProcessId source_pid_;
|
| - const base::ProcessId dest_pid_;
|
| - mach_port_name_t port_to_extract_;
|
| - const BrokerableAttachment::AttachmentId id_;
|
| - };
|
| -
|
| - // IPC message handlers.
|
| - void OnDuplicateMachPort(const Message& message);
|
| -
|
| - // Duplicates the Mach port referenced from |wire_format| from
|
| - // |source_process| into |wire_format|'s destination process.
|
| - MachPortWireFormat DuplicateMachPort(const MachPortWireFormat& wire_format,
|
| - base::ProcessId source_process);
|
| -
|
| - // Extracts a copy of the send right to |named_right| from |task_port|.
|
| - // Returns MACH_PORT_NULL on error.
|
| - base::mac::ScopedMachSendRight ExtractNamedRight(
|
| - mach_port_t task_port,
|
| - mach_port_name_t named_right);
|
| -
|
| - // Copies an existing |wire_format|, but substitutes in a different mach port.
|
| - MachPortWireFormat CopyWireFormat(const MachPortWireFormat& wire_format,
|
| - uint32_t mach_port);
|
| -
|
| - // |wire_format.destination_process| must be this process.
|
| - // |wire_format.mach_port| must be the final Mach port.
|
| - // Consumes a reference to |wire_format.mach_port|, as ownership is implicitly
|
| - // passed to the consumer of the Chrome IPC message.
|
| - // Makes an attachment, queues it, and notifies the observers.
|
| - void RoutePrecursorToSelf(AttachmentPrecursor* precursor);
|
| -
|
| - // |wire_format.destination_process| must be another process.
|
| - // |wire_format.mach_port| must be the intermediate Mach port.
|
| - // Ownership of |wire_format.mach_port| is implicitly passed to the process
|
| - // that receives the Chrome IPC message.
|
| - // Returns |false| on irrecoverable error.
|
| - bool RouteWireFormatToAnother(const MachPortWireFormat& wire_format);
|
| -
|
| - // Atempts to broker all precursors whose destination is |pid|. Has no effect
|
| - // if |port_provider_| does not have the task port for |pid|.
|
| - // If a communication channel has not been established from the destination
|
| - // process, and |store_on_failure| is true, then the precursor is kept for
|
| - // later reuse. If |store_on_failure| is false, then the precursor is deleted.
|
| - void SendPrecursorsForProcess(base::ProcessId pid, bool store_on_failure);
|
| -
|
| - // Brokers a single precursor into the task represented by |task_port|.
|
| - // Returns |false| on irrecoverable error.
|
| - bool SendPrecursor(AttachmentPrecursor* precursor, mach_port_t task_port);
|
| -
|
| - // Add a precursor to |precursors_|. Takes ownership of |port|.
|
| - void AddPrecursor(base::ProcessId pid,
|
| - base::mac::ScopedMachSendRight port,
|
| - const BrokerableAttachment::AttachmentId& id);
|
| -
|
| - // Atempts to process all extractors whose source is |pid|. Has no effect
|
| - // if |port_provider_| does not have the task port for |pid|.
|
| - // If a communication channel has not been established from the source
|
| - // process, and |store_on_failure| is true, then the extractor is kept for
|
| - // later reuse. If |store_on_failure| is false, then the extractor is deleted.
|
| - void ProcessExtractorsForProcess(base::ProcessId pid, bool store_on_failure);
|
| -
|
| - // Processes a single extractor whose source pid is represented by
|
| - // |task_port|.
|
| - void ProcessExtractor(AttachmentExtractor* extractor, mach_port_t task_port);
|
| -
|
| - // Add an extractor to |extractors_|.
|
| - void AddExtractor(base::ProcessId source_pid,
|
| - base::ProcessId dest_pid,
|
| - mach_port_name_t port,
|
| - const BrokerableAttachment::AttachmentId& id);
|
| -
|
| - // The port provider must live at least as long as the AttachmentBroker.
|
| - base::PortProvider* port_provider_;
|
| -
|
| - // For each ProcessId, a vector of precursors that are waiting to be
|
| - // sent.
|
| - std::map<base::ProcessId, ScopedVector<AttachmentPrecursor>*> precursors_;
|
| - base::Lock precursors_lock_;
|
| -
|
| - // For each ProcessId, a vector of extractors that are waiting to be
|
| - // processed.
|
| - std::map<base::ProcessId, ScopedVector<AttachmentExtractor>*> extractors_;
|
| - base::Lock extractors_lock_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(AttachmentBrokerPrivilegedMac);
|
| -};
|
| -
|
| -} // namespace IPC
|
| -
|
| -#endif // IPC_ATTACHMENT_BROKER_PRIVILEGED_MAC_H_
|
|
|