| Index: mojo/edk/system/message_pipe_dispatcher.cc
|
| diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc
|
| index e3e67ab9d91f208fe383d06e73fcfd294f396897..fb3ce4e9f3c2079041d56d04e22f46a191741991 100644
|
| --- a/mojo/edk/system/message_pipe_dispatcher.cc
|
| +++ b/mojo/edk/system/message_pipe_dispatcher.cc
|
| @@ -16,6 +16,10 @@
|
| #include "mojo/edk/system/options_validation.h"
|
| #include "mojo/edk/system/transport_data.h"
|
|
|
| +#if defined(OS_WIN)
|
| +#include "mojo/edk/system/token_serializer_win.h"
|
| +#endif
|
| +
|
| namespace mojo {
|
| namespace edk {
|
|
|
| @@ -38,7 +42,7 @@ struct MOJO_ALIGNAS(8) SerializedMessagePipeHandleDispatcher {
|
|
|
| size_t serialized_read_buffer_size;
|
| size_t serialized_write_buffer_size;
|
| - size_t serialized_messagage_queue_size;
|
| + size_t serialized_message_queue_size;
|
|
|
| // These are the FDs required as part of serializing channel_ and
|
| // message_queue_. This is only used on POSIX.
|
| @@ -161,9 +165,9 @@ Dispatcher::Type MessagePipeDispatcher::GetType() const {
|
| return Type::MESSAGE_PIPE;
|
| }
|
|
|
| +#if defined(OS_WIN)
|
| // TODO(jam): this is copied from RawChannelWin till I figure out what's the
|
| -// best way we want to share this. Need to also consider posix which does
|
| -// require access to the RawChannel.
|
| +// best way we want to share this.
|
| // Since this is used for serialization of messages read/written to a MP that
|
| // aren't consumed by Mojo primitives yet, there could be an unbounded number of
|
| // them when a MP is being sent. As a result, even for POSIX we will probably
|
| @@ -173,41 +177,16 @@ Dispatcher::Type MessagePipeDispatcher::GetType() const {
|
| ScopedPlatformHandleVectorPtr GetReadPlatformHandles(
|
| size_t num_platform_handles,
|
| const void* platform_handle_table) {
|
| - // TODO(jam): this code will have to be updated once it's used in a sandbox
|
| - // and the receiving process doesn't have duplicate permission for the
|
| - // receiver. Once there's a broker and we have a connection to it (possibly
|
| - // through ConnectionManager), then we can make a sync IPC to it here to get a
|
| - // token for this handle, and it will duplicate the handle to is process. Then
|
| - // we pass the token to the receiver, which will then make a sync call to the
|
| - // broker to get a duplicated handle. This will also allow us to avoid leaks
|
| - // of the handle if the receiver dies, since the broker can notice that.
|
| - DCHECK_GT(num_platform_handles, 0u);
|
| ScopedPlatformHandleVectorPtr rv(new PlatformHandleVector());
|
| + rv->resize(num_platform_handles);
|
|
|
| -#if defined(OS_WIN)
|
| - const char* serialization_data =
|
| - static_cast<const char*>(platform_handle_table);
|
| - for (size_t i = 0; i < num_platform_handles; i++) {
|
| - DWORD pid = *reinterpret_cast<const DWORD*>(serialization_data);
|
| - serialization_data += sizeof(DWORD);
|
| - HANDLE source_handle = *reinterpret_cast<const HANDLE*>(serialization_data);
|
| - serialization_data += sizeof(HANDLE);
|
| - base::Process sender =
|
| - base::Process::OpenWithAccess(pid, PROCESS_DUP_HANDLE);
|
| - DCHECK(sender.IsValid());
|
| - HANDLE target_handle = NULL;
|
| - BOOL dup_result =
|
| - DuplicateHandle(sender.Handle(), source_handle,
|
| - base::GetCurrentProcessHandle(), &target_handle, 0,
|
| - FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
|
| - DCHECK(dup_result);
|
| - rv->push_back(PlatformHandle(target_handle));
|
| - }
|
| -#else
|
| - NOTREACHED() << "TODO(jam): implement";
|
| -#endif
|
| + const uint64_t* tokens =
|
| + static_cast<const uint64_t*>(platform_handle_table);
|
| + internal::g_token_serializer->TokenToHandle(
|
| + tokens, num_platform_handles, &rv->at(0));
|
| return rv.Pass();
|
| }
|
| +#endif
|
|
|
| scoped_refptr<MessagePipeDispatcher> MessagePipeDispatcher::Deserialize(
|
| const void* source,
|
| @@ -223,7 +202,7 @@ scoped_refptr<MessagePipeDispatcher> MessagePipeDispatcher::Deserialize(
|
| if (serialization->shared_memory_size !=
|
| (serialization->serialized_read_buffer_size +
|
| serialization->serialized_write_buffer_size +
|
| - serialization->serialized_messagage_queue_size)) {
|
| + serialization->serialized_message_queue_size)) {
|
| LOG(ERROR) << "Invalid serialized message pipe dispatcher (bad struct)";
|
| return nullptr;
|
| }
|
| @@ -260,9 +239,9 @@ scoped_refptr<MessagePipeDispatcher> MessagePipeDispatcher::Deserialize(
|
| serialization->serialized_write_buffer_size;
|
| buffer += serialized_write_buffer_size;
|
| }
|
| - if (serialization->serialized_messagage_queue_size) {
|
| + if (serialization->serialized_message_queue_size) {
|
| message_queue_data = buffer;
|
| - message_queue_size = serialization->serialized_messagage_queue_size;
|
| + message_queue_size = serialization->serialized_message_queue_size;
|
| buffer += message_queue_size;
|
| }
|
| }
|
| @@ -459,18 +438,13 @@ void MessagePipeDispatcher::SerializeInternal() {
|
| message->transport_data()->platform_handles();
|
| if (all_platform_handles) {
|
| #if defined(OS_WIN)
|
| - char* serialization_data =
|
| + uint64_t* tokens = reinterpret_cast<uint64_t*>(
|
| static_cast<char*>(message->transport_data()->buffer()) +
|
| - message->transport_data()->platform_handle_table_offset();
|
| - DWORD current_process_id = base::GetCurrentProcId();
|
| - for (size_t i = 0; i < all_platform_handles->size(); i++) {
|
| - *reinterpret_cast<DWORD*>(serialization_data) = current_process_id;
|
| - serialization_data += sizeof(DWORD);
|
| - *reinterpret_cast<HANDLE*>(serialization_data) =
|
| - all_platform_handles->at(i).handle;
|
| - serialization_data += sizeof(HANDLE);
|
| + message->transport_data()->platform_handle_table_offset());
|
| + internal::g_token_serializer->HandleToToken(
|
| + &all_platform_handles->at(0), all_platform_handles->size(), tokens);
|
| + for (size_t i = 0; i < all_platform_handles->size(); i++)
|
| all_platform_handles->at(i) = PlatformHandle();
|
| - }
|
| #else
|
| for (size_t i = 0; i < all_platform_handles->size(); i++) {
|
| serialized_fds_.push_back(all_platform_handles->at(i).fd);
|
| @@ -700,13 +674,13 @@ bool MessagePipeDispatcher::EndSerializeAndCloseImplNoLock(
|
| serialization->write_error = write_error_;
|
| serialization->serialized_read_buffer_size = serialized_read_buffer_.size();
|
| serialization->serialized_write_buffer_size = serialized_write_buffer_.size();
|
| - serialization->serialized_messagage_queue_size =
|
| + serialization->serialized_message_queue_size =
|
| serialized_message_queue_.size();
|
|
|
| serialization->shared_memory_size = static_cast<uint32_t>(
|
| serialization->serialized_read_buffer_size +
|
| serialization->serialized_write_buffer_size +
|
| - serialization->serialized_messagage_queue_size);
|
| + serialization->serialized_message_queue_size);
|
| if (serialization->shared_memory_size) {
|
| scoped_refptr<PlatformSharedBuffer> shared_buffer(
|
| internal::g_platform_support->CreateSharedBuffer(
|
|
|