Index: mojo/edk/system/raw_channel_win.cc |
diff --git a/mojo/edk/system/raw_channel_win.cc b/mojo/edk/system/raw_channel_win.cc |
index 0ceb521af2e65e981b85f66c5aedb11d81f00a21..1e27455500c56fdc122b3f2e50db28a4255902fa 100644 |
--- a/mojo/edk/system/raw_channel_win.cc |
+++ b/mojo/edk/system/raw_channel_win.cc |
@@ -19,6 +19,7 @@ |
#include "base/win/windows_version.h" |
#include "mojo/edk/embedder/embedder_internal.h" |
#include "mojo/edk/embedder/platform_handle.h" |
+#include "mojo/edk/system/token_serializer_win.h" |
#include "mojo/edk/system/transport_data.h" |
#include "mojo/public/cpp/system/macros.h" |
@@ -30,11 +31,6 @@ namespace edk { |
namespace { |
-struct MOJO_ALIGNAS(8) SerializedHandle { |
- DWORD handle_pid; |
- HANDLE handle; |
-}; |
- |
class VistaOrHigherFunctions { |
public: |
VistaOrHigherFunctions() |
@@ -602,35 +598,14 @@ class RawChannelWin final : public RawChannel { |
ScopedPlatformHandleVectorPtr GetReadPlatformHandles( |
size_t num_platform_handles, |
const void* platform_handle_table) override { |
- // 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); |
- const SerializedHandle* serialization_data = |
- static_cast<const SerializedHandle*>(platform_handle_table); |
- for (size_t i = 0; i < num_platform_handles; i++) { |
- DWORD pid = serialization_data->handle_pid; |
- HANDLE source_handle = serialization_data->handle; |
- serialization_data ++; |
- 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)); |
- } |
+ 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(); |
} |
@@ -638,26 +613,19 @@ class RawChannelWin final : public RawChannel { |
if (!write_buffer_no_lock()->HavePlatformHandlesToSend()) |
return 0u; |
- // Since we're not sure which process might ultimately deserialize this |
- // message, we can't duplicate the handle now. Instead, write the process |
- // ID and handle now and let the receiver duplicate it. |
PlatformHandle* platform_handles; |
void* serialization_data_temp; |
size_t num_platform_handles; |
write_buffer_no_lock()->GetPlatformHandlesToSend( |
&num_platform_handles, &platform_handles, &serialization_data_temp); |
- SerializedHandle* serialization_data = |
- static_cast<SerializedHandle*>(serialization_data_temp); |
+ uint64_t* tokens = static_cast<uint64_t*>(serialization_data_temp); |
DCHECK_GT(num_platform_handles, 0u); |
DCHECK(platform_handles); |
- DWORD current_process_id = base::GetCurrentProcId(); |
- for (size_t i = 0; i < num_platform_handles; i++) { |
- serialization_data->handle_pid = current_process_id; |
- serialization_data->handle = platform_handles[i].handle; |
- serialization_data++; |
+ internal::g_token_serializer->HandleToToken( |
+ &platform_handles[0], num_platform_handles, tokens); |
+ for (size_t i = 0; i < num_platform_handles; i++) |
platform_handles[i] = PlatformHandle(); |
- } |
return num_platform_handles; |
} |
@@ -778,7 +746,7 @@ RawChannel* RawChannel::Create(ScopedPlatformHandle handle) { |
} |
size_t RawChannel::GetSerializedPlatformHandleSize() { |
- return sizeof(SerializedHandle); |
+ return sizeof(uint64_t); |
} |
bool RawChannel::IsOtherEndOf(RawChannel* other) { |