| Index: mojo/edk/system/channel.cc
|
| diff --git a/mojo/edk/system/channel.cc b/mojo/edk/system/channel.cc
|
| index 79928845a4453b0648359677e486e8f7b56abc39..56509b5b609f44886a6b883ffaba121fb3d0daa9 100644
|
| --- a/mojo/edk/system/channel.cc
|
| +++ b/mojo/edk/system/channel.cc
|
| @@ -121,12 +121,6 @@ Channel::Message::~Message() {
|
| // static
|
| Channel::MessagePtr Channel::Message::Deserialize(const void* data,
|
| size_t data_num_bytes) {
|
| -#if !defined(OS_WIN) && !(defined(OS_MACOSX) && !defined(OS_IOS))
|
| - // We only serialize messages into other messages when performing message
|
| - // relay on Windows and OSX.
|
| - NOTREACHED();
|
| - return nullptr;
|
| -#else
|
| if (data_num_bytes < sizeof(Header))
|
| return nullptr;
|
|
|
| @@ -137,6 +131,10 @@ Channel::MessagePtr Channel::Message::Deserialize(const void* data,
|
| return nullptr;
|
| }
|
|
|
| +#if defined(MOJO_EDK_LEGACY_PROTOCOL)
|
| + size_t payload_size = data_num_bytes - sizeof(Header);
|
| + const char* payload = static_cast<const char*>(data) + sizeof(Header);
|
| +#else
|
| if (header->num_bytes < header->num_header_bytes ||
|
| header->num_header_bytes < sizeof(Header)) {
|
| DLOG(ERROR) << "Decoding invalid message: " << header->num_bytes << " < "
|
| @@ -145,6 +143,11 @@ Channel::MessagePtr Channel::Message::Deserialize(const void* data,
|
| }
|
|
|
| uint32_t extra_header_size = header->num_header_bytes - sizeof(Header);
|
| + size_t payload_size = data_num_bytes - header->num_header_bytes;
|
| + const char* payload =
|
| + static_cast<const char*>(data) + header->num_header_bytes;
|
| +#endif // defined(MOJO_EDK_LEGACY_PROTOCOL)
|
| +
|
| #if defined(OS_WIN)
|
| uint32_t max_handles = extra_header_size / sizeof(HandleEntry);
|
| #elif defined(OS_MACOSX) && !defined(OS_IOS)
|
| @@ -155,32 +158,34 @@ Channel::MessagePtr Channel::Message::Deserialize(const void* data,
|
| }
|
| uint32_t max_handles = (extra_header_size - sizeof(MachPortsExtraHeader)) /
|
| sizeof(MachPortsEntry);
|
| -#endif
|
| +#else
|
| + const uint32_t max_handles = 0;
|
| +#endif // defined(OS_WIN)
|
| +
|
| if (header->num_handles > max_handles || max_handles > kMaxAttachedHandles) {
|
| DLOG(ERROR) << "Decoding invalid message:" << header->num_handles
|
| << " > " << max_handles;
|
| return nullptr;
|
| }
|
|
|
| - MessagePtr message(new Message(data_num_bytes - header->num_header_bytes,
|
| - max_handles));
|
| + MessagePtr message(new Message(payload_size, max_handles));
|
| DCHECK_EQ(message->data_num_bytes(), data_num_bytes);
|
| +
|
| + // Copy all payload bytes.
|
| + if (payload_size)
|
| + memcpy(message->mutable_payload(), payload, payload_size);
|
| +
|
| +#if !defined(MOJO_EDK_LEGACY_PROTOCOL)
|
| DCHECK_EQ(message->extra_header_size(), extra_header_size);
|
| DCHECK_EQ(message->header_->num_header_bytes, header->num_header_bytes);
|
|
|
| - if (data_num_bytes > header->num_header_bytes) {
|
| - // Copy all payload bytes.
|
| - memcpy(message->mutable_payload(),
|
| - static_cast<const char*>(data) + header->num_header_bytes,
|
| - data_num_bytes - header->num_header_bytes);
|
| - }
|
| -
|
| if (message->extra_header_size()) {
|
| // Copy extra header bytes.
|
| memcpy(message->mutable_extra_header(),
|
| static_cast<const char*>(data) + sizeof(Header),
|
| message->extra_header_size());
|
| }
|
| +#endif
|
|
|
| message->header_->num_handles = header->num_handles;
|
| #if defined(OS_WIN)
|
| @@ -194,7 +199,6 @@ Channel::MessagePtr Channel::Message::Deserialize(const void* data,
|
| #endif
|
|
|
| return message;
|
| -#endif
|
| }
|
|
|
| size_t Channel::Message::payload_size() const {
|
|
|