Index: ppapi/proxy/ppb_audio_proxy.cc |
diff --git a/ppapi/proxy/ppb_audio_proxy.cc b/ppapi/proxy/ppb_audio_proxy.cc |
index 3e7350bf4297c305c21710f0030dd0a5954e2bac..65f4b343639676c28ad321a9befcb58f342a8d8c 100644 |
--- a/ppapi/proxy/ppb_audio_proxy.cc |
+++ b/ppapi/proxy/ppb_audio_proxy.cc |
@@ -129,6 +129,18 @@ InterfaceProxy* CreateAudioProxy(Dispatcher* dispatcher, |
return new PPB_Audio_Proxy(dispatcher, target_interface); |
} |
+base::PlatformFile IntToPlatformFile(int32_t handle) { |
+ // TODO(piman/brettw): Change trusted interface to return a PP_FileHandle, |
+ // those casts are ugly. |
+#if defined(OS_WIN) |
+ return reinterpret_cast<HANDLE>(static_cast<intptr_t>(handle)); |
+#elif defined(OS_POSIX) |
+ return handle; |
+#else |
+ #error Not implemented. |
+#endif |
+} |
+ |
} // namespace |
PPB_Audio_Proxy::PPB_Audio_Proxy(Dispatcher* dispatcher, |
@@ -226,13 +238,7 @@ void PPB_Audio_Proxy::AudioChannelConnected( |
const HostResource& resource) { |
IPC::PlatformFileForTransit socket_handle = |
IPC::InvalidPlatformFileForTransit(); |
-#if defined(OS_WIN) |
- base::SharedMemoryHandle shared_memory = NULL; |
-#elif defined(OS_POSIX) |
- base::SharedMemoryHandle shared_memory(-1, false); |
-#else |
- #error Not implemented. |
-#endif |
+ base::SharedMemoryHandle shared_memory = IPC::InvalidPlatformFileForTransit(); |
uint32_t shared_memory_length = 0; |
int32_t result_code = result; |
@@ -271,23 +277,13 @@ int32_t PPB_Audio_Proxy::GetAudioConnectedHandles( |
if (result != PP_OK) |
return result; |
-#if defined(OS_WIN) |
- // On Windows, duplicate the socket into the plugin process, this will |
- // automatically close the source handle. |
- ::DuplicateHandle( |
- GetCurrentProcess(), |
- reinterpret_cast<HANDLE>(static_cast<intptr_t>(socket_handle)), |
- dispatcher()->remote_process_handle(), foreign_socket_handle, |
- STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE, |
- FALSE, DUPLICATE_CLOSE_SOURCE); |
-#else |
- // On Posix, the socket handle will be auto-duplicated when we send the |
- // FileDescriptor. Don't set AutoClose since this is not our handle. |
- *foreign_socket_handle = base::FileDescriptor(socket_handle, false); |
-#endif |
+ // socket_handle doesn't belong to us: don't close it. |
+ *foreign_socket_handle = dispatcher()->ShareHandleWithRemote( |
+ IntToPlatformFile(socket_handle), false); |
+ if (*foreign_socket_handle == IPC::InvalidPlatformFileForTransit()) |
+ return PP_ERROR_FAILED; |
// Get the shared memory for the buffer. |
- // TODO(brettw) remove the reinterpret cast when the interface is updated. |
int shared_memory_handle; |
result = audio_trusted->GetSharedMemory(resource.host_resource(), |
&shared_memory_handle, |
@@ -295,18 +291,10 @@ int32_t PPB_Audio_Proxy::GetAudioConnectedHandles( |
if (result != PP_OK) |
return result; |
- base::SharedMemory shared_memory( |
-#if defined(OS_WIN) |
- reinterpret_cast<HANDLE>(static_cast<intptr_t>(shared_memory_handle)), |
-#else |
- base::FileDescriptor(shared_memory_handle, false), |
-#endif |
- false); |
- |
- // Duplicate the shared memory to the plugin process. This will automatically |
- // close the source handle. |
- if (!shared_memory.GiveToProcess(dispatcher()->remote_process_handle(), |
- foreign_shared_memory_handle)) |
+ // shared_memory_handle doesn't belong to us: don't close it. |
+ *foreign_shared_memory_handle = dispatcher()->ShareHandleWithRemote( |
+ IntToPlatformFile(shared_memory_handle), false); |
+ if (*foreign_shared_memory_handle == IPC::InvalidPlatformFileForTransit()) |
return PP_ERROR_FAILED; |
return PP_OK; |