Index: mojo/edk/system/channel.cc |
diff --git a/mojo/edk/system/channel.cc b/mojo/edk/system/channel.cc |
index 2976a21b8a4b2d5b4a8e289fb0748991998bef30..c3e66cba266b359986e803708413e8b246c03fe8 100644 |
--- a/mojo/edk/system/channel.cc |
+++ b/mojo/edk/system/channel.cc |
@@ -124,12 +124,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; |
@@ -140,6 +134,7 @@ Channel::MessagePtr Channel::Message::Deserialize(const void* data, |
return nullptr; |
} |
+#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) |
if (header->num_bytes < header->num_header_bytes) { |
DLOG(ERROR) << "Decoding invalid message: " << header->num_bytes << " < " |
<< header->num_header_bytes; |
@@ -147,41 +142,53 @@ 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; |
#if defined(OS_WIN) |
uint32_t max_handles = extra_header_size / sizeof(PlatformHandle); |
#elif defined(OS_MACOSX) && !defined(OS_IOS) |
uint32_t max_handles = extra_header_size / sizeof(MachPortsEntry); |
+#else |
+ const uint32_t max_handles = 0; |
#endif |
+ |
+#else // !defined(OS_ANDROID) && !defined(OS_CHROMEOS) |
+ // We only serialize messages with handles into other messages when performing |
+ // message relay on Windows and OSX. |
+ const uint32_t max_handles = 0; |
+ const char* payload = static_cast<const char*>(data) + sizeof(Header); |
+ size_t payload_size = data_num_bytes; |
+#endif // !defined(OS_ANDROID) && !defined(OS_CHROMEOS) |
+ |
if (header->num_handles > max_handles) { |
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(OS_ANDROID) && !defined(OS_CHROMEOS) |
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 // !defined(OS_ANDROID) && !defined(OS_CHROMEOS) |
message->header_->num_handles = header->num_handles; |
return message; |
-#endif |
} |
size_t Channel::Message::payload_size() const { |