Index: components/nacl/browser/nacl_host_message_filter.cc |
diff --git a/components/nacl/browser/nacl_host_message_filter.cc b/components/nacl/browser/nacl_host_message_filter.cc |
index 7dfa782e234869310182097854b67ad7f824dc95..2fc72d611975a2d175ea85a9d128856f113e626c 100644 |
--- a/components/nacl/browser/nacl_host_message_filter.cc |
+++ b/components/nacl/browser/nacl_host_message_filter.cc |
@@ -143,10 +143,40 @@ void NaClHostMessageFilter::LaunchNaClContinuation( |
const nacl::NaClLaunchParams& launch_params, |
IPC::Message* reply_msg, |
ppapi::PpapiPermissions permissions) { |
+ NaClFileToken nexe_token = { |
+ launch_params.nexe_token_lo, // lo |
+ launch_params.nexe_token_hi // hi |
+ }; |
+ |
+ base::PlatformFile nexe_file; |
+#if defined(OS_WIN) |
+ // Duplicate the nexe file handle from the renderer process into the browser |
+ // process. |
+ if (!::DuplicateHandle(PeerHandle(), |
+ launch_params.nexe_file, |
+ base::GetCurrentProcessHandle(), |
+ &nexe_file, |
+ 0, // Unused, given DUPLICATE_SAME_ACCESS. |
+ FALSE, |
+ DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { |
+ NaClHostMsg_LaunchNaCl::WriteReplyParams( |
+ reply_msg, |
+ NaClLaunchResult(), |
+ std::string("Failed to duplicate nexe file handle")); |
+ Send(reply_msg); |
+ return; |
+ } |
+#elif defined(OS_POSIX) |
+ nexe_file = |
+ IPC::PlatformFileForTransitToPlatformFile(launch_params.nexe_file); |
+#else |
+#error Unsupported platform. |
+#endif |
+ |
NaClProcessHost* host = new NaClProcessHost( |
GURL(launch_params.manifest_url), |
- base::File( |
- IPC::PlatformFileForTransitToPlatformFile(launch_params.nexe_file)), |
+ base::File(nexe_file), |
+ nexe_token, |
permissions, |
launch_params.render_view_id, |
launch_params.permission_bits, |