| Index: content/renderer/webplugin_delegate_proxy.cc
|
| ===================================================================
|
| --- content/renderer/webplugin_delegate_proxy.cc (revision 132263)
|
| +++ content/renderer/webplugin_delegate_proxy.cc (working copy)
|
| @@ -18,6 +18,7 @@
|
| #include "base/logging.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/process.h"
|
| #include "base/string_split.h"
|
| #include "base/string_util.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -60,6 +61,10 @@
|
| #include "base/mac/mac_util.h"
|
| #endif
|
|
|
| +#if defined(OS_WIN)
|
| +#include "content/common/sandbox_policy.h"
|
| +#endif
|
| +
|
| using WebKit::WebBindings;
|
| using WebKit::WebCursorInfo;
|
| using WebKit::WebDragData;
|
| @@ -484,7 +489,8 @@
|
|
|
| static void CopyTransportDIBHandleForMessage(
|
| const TransportDIB::Handle& handle_in,
|
| - TransportDIB::Handle* handle_out) {
|
| + TransportDIB::Handle* handle_out,
|
| + base::ProcessId peer_pid) {
|
| #if defined(OS_MACOSX)
|
| // On Mac, TransportDIB::Handle is typedef'ed to FileDescriptor, and
|
| // FileDescriptor message fields needs to remain valid until the message is
|
| @@ -494,6 +500,12 @@
|
| return;
|
| }
|
| handle_out->auto_close = true;
|
| +#elif defined(OS_WIN)
|
| + // On Windows we need to duplicate the handle for the plugin process.
|
| + *handle_out = NULL;
|
| + sandbox::BrokerDuplicateHandle(handle_in, peer_pid, handle_out,
|
| + FILE_MAP_READ | FILE_MAP_WRITE, 0);
|
| + CHECK(*handle_out != NULL);
|
| #else
|
| // Don't need to do anything special for other platforms.
|
| *handle_out = handle_in;
|
| @@ -520,15 +532,18 @@
|
| {
|
| if (transport_stores_[0].dib.get())
|
| CopyTransportDIBHandleForMessage(transport_stores_[0].dib->handle(),
|
| - ¶m.windowless_buffer0);
|
| + ¶m.windowless_buffer0,
|
| + channel_host_->peer_pid());
|
|
|
| if (transport_stores_[1].dib.get())
|
| CopyTransportDIBHandleForMessage(transport_stores_[1].dib->handle(),
|
| - ¶m.windowless_buffer1);
|
| + ¶m.windowless_buffer1,
|
| + channel_host_->peer_pid());
|
|
|
| if (background_store_.dib.get())
|
| CopyTransportDIBHandleForMessage(background_store_.dib->handle(),
|
| - ¶m.background_buffer);
|
| + ¶m.background_buffer,
|
| + channel_host_->peer_pid());
|
| }
|
|
|
| IPC::Message* msg;
|
|
|