Index: components/nacl/renderer/manifest_service_channel.cc |
diff --git a/components/nacl/renderer/manifest_service_channel.cc b/components/nacl/renderer/manifest_service_channel.cc |
index cb397038f82760ea310db0e093078bca4035ea41..41f68dff4e944cc1a3229a264b9837b9a5191331 100644 |
--- a/components/nacl/renderer/manifest_service_channel.cc |
+++ b/components/nacl/renderer/manifest_service_channel.cc |
@@ -7,10 +7,12 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
#include "base/callback_helpers.h" |
+#include "content/public/common/sandbox_init.h" |
#include "content/public/renderer/render_thread.h" |
#include "ipc/ipc_channel.h" |
#include "ipc/ipc_sync_channel.h" |
#include "ppapi/c/pp_errors.h" |
+#include "ppapi/c/ppb_file_io.h" |
#include "ppapi/proxy/ppapi_messages.h" |
namespace nacl { |
@@ -29,6 +31,7 @@ ManifestServiceChannel::ManifestServiceChannel( |
content::RenderThread::Get()->GetIOMessageLoopProxy(), |
true, |
waitable_event)), |
+ peer_pid_(base::kNullProcessId), |
weak_ptr_factory_(this) { |
} |
@@ -54,6 +57,7 @@ bool ManifestServiceChannel::OnMessageReceived(const IPC::Message& message) { |
} |
void ManifestServiceChannel::OnChannelConnected(int32 peer_pid) { |
+ peer_pid_ = peer_pid; |
if (!connected_callback_.is_null()) |
base::ResetAndReturn(&connected_callback_).Run(PP_OK); |
} |
@@ -69,31 +73,38 @@ void ManifestServiceChannel::OnStartupInitializationComplete() { |
void ManifestServiceChannel::OnOpenResource( |
const std::string& key, IPC::Message* reply) { |
- // Currently this is used only for non-SFI mode, which is not supported on |
- // windows. |
-#if !defined(OS_WIN) |
delegate_->OpenResource( |
key, |
base::Bind(&ManifestServiceChannel::DidOpenResource, |
weak_ptr_factory_.GetWeakPtr(), reply)); |
-#else |
- PpapiHostMsg_OpenResource::WriteReplyParams( |
- reply, ppapi::proxy::SerializedHandle()); |
- Send(reply); |
-#endif |
} |
-#if !defined(OS_WIN) |
-void ManifestServiceChannel::DidOpenResource( |
- IPC::Message* reply, base::File file) { |
- // Here, PlatformFileForTransit is alias of base::FileDescriptor. |
- PpapiHostMsg_OpenResource::WriteReplyParams( |
- reply, |
- ppapi::proxy::SerializedHandle( |
- ppapi::proxy::SerializedHandle::FILE, |
- base::FileDescriptor(file.Pass()))); |
+void ManifestServiceChannel::DidOpenResource(IPC::Message* reply, |
+ base::File file, |
+ uint64_t token_lo, |
+ uint64_t token_hi) { |
+ ppapi::proxy::SerializedHandle handle; |
+ if (file.IsValid()) { |
+ IPC::PlatformFileForTransit file_for_transit; |
+#if defined(OS_WIN) |
+ bool ok = content::BrokerDuplicateHandle( |
+ file.TakePlatformFile(), |
+ peer_pid_, |
+ &file_for_transit, |
+ 0, // desired_access is 0 since we're using DUPLICATE_SAME_ACCESS. |
+ DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); |
+ if (ok) |
+ handle.set_file_handle(file_for_transit, PP_FILEOPENFLAG_READ, 0); |
+#else |
+ file_for_transit = base::FileDescriptor(file.Pass()); |
+ handle.set_file_handle(file_for_transit, PP_FILEOPENFLAG_READ, 0); |
+#endif |
+ } |
+ PpapiHostMsg_OpenResource::WriteReplyParams(reply, |
+ handle, |
+ token_lo, |
+ token_hi); |
Send(reply); |
} |
-#endif |
} // namespace nacl |