Index: mojo/services/gles2/command_buffer_impl.cc |
diff --git a/mojo/services/gles2/command_buffer_impl.cc b/mojo/services/gles2/command_buffer_impl.cc |
index 71df2c5e7a9d9ed14cb0446528f7a7cdd42f6508..3ffa3946582edeb38325d861bc9efd97173c8f03 100644 |
--- a/mojo/services/gles2/command_buffer_impl.cc |
+++ b/mojo/services/gles2/command_buffer_impl.cc |
@@ -143,9 +143,24 @@ void CommandBufferImpl::MakeProgress(int32_t last_get_offset) { |
void CommandBufferImpl::RegisterTransferBuffer(int32_t id, |
const ShmHandle& transfer_buffer, |
uint32_t size) { |
- bool read_only = false; |
- base::SharedMemory shared_memory(transfer_buffer, read_only); |
- command_buffer_->RegisterTransferBuffer(id, &shared_memory, size); |
+ // Duplicate the shared memory for this process. |
+ base::SharedMemory shared_memory(transfer_buffer, false); |
+ base::SharedMemoryHandle duped_shared_memory_handle; |
+ if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(), |
+ &duped_shared_memory_handle)) { |
+ DVLOG(0) << "Failed to duplicate shared memory handle."; |
+ return; |
+ } |
+ scoped_ptr<base::SharedMemory> duped_shared_memory( |
+ new base::SharedMemory(duped_shared_memory_handle, false)); |
+ |
+ // Map the shared memory into this process. This validates the size. |
+ if (!duped_shared_memory->Map(size)) { |
+ DVLOG(0) << "Failed to map shared memory."; |
+ return; |
+ } |
+ |
+ command_buffer_->RegisterTransferBuffer(id, duped_shared_memory.Pass(), size); |
} |
void CommandBufferImpl::DestroyTransferBuffer(int32_t id) { |