10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Use of this source code is governed by a BSD-style license that can be
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// found in the LICENSE file.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "content/common/sandbox_util.h"
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#if defined(OS_POSIX)
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <unistd.h>
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "content/public/common/sandbox_init.h"
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace content {
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgIPC::PlatformFileForTransit BrokerGetFileHandleForProcess(
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    base::PlatformFile handle,
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    base::ProcessId target_process_id,
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool should_close_source) {
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  IPC::PlatformFileForTransit out_handle;
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#if defined(OS_WIN)
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DWORD options = DUPLICATE_SAME_ACCESS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (should_close_source)
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    options |= DUPLICATE_CLOSE_SOURCE;
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!content::BrokerDuplicateHandle(handle, target_process_id, &out_handle,
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                      0, options)) {
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    out_handle = IPC::InvalidPlatformFileForTransit();
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#elif defined(OS_POSIX)
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // If asked to close the source, we can simply re-use the source fd instead of
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // dup()ing and close()ing.
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // When we're not closing the source, we need to duplicate the handle and take
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // ownership of that. The reason is that this function is often used to
33cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org  // generate IPC messages, and the handle must remain valid until it's sent to
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // the other process from the I/O thread. Without the dup, calling code might
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // close the source handle before the message is sent, creating a race
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // condition.
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int fd = should_close_source ? handle : ::dup(handle);
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  out_handle = base::FileDescriptor(fd, true);
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#else
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  #error Not implemented.
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return out_handle;
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace content
46cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org