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