Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(488)

Unified Diff: ipc/ipc_message_utils.cc

Issue 10667002: Make the serialization of IPC::Messages inside other IPC::Messages independent (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ipc/ipc_message.cc ('k') | ipc/ipc_message_utils_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ipc/ipc_message_utils.cc
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
index a8392cf5c5d0354ba07d7ce6b25149cfc60f930a..66a68775ce1124a91a34d33bee671f6173c16f69 100644
--- a/ipc/ipc_message_utils.cc
+++ b/ipc/ipc_message_utils.cc
@@ -730,22 +730,43 @@ void ParamTraits<LogData>::Log(const param_type& p, std::string* l) {
}
void ParamTraits<Message>::Write(Message* m, const Message& p) {
- DCHECK(p.size() <= INT_MAX);
- int message_size = static_cast<int>(p.size());
- m->WriteInt(message_size);
- m->WriteData(reinterpret_cast<const char*>(p.data()), message_size);
+#if defined(OS_POSIX)
+ // We don't serialize the file descriptors in the nested message, so there
+ // better not be any.
+ DCHECK(!p.HasFileDescriptors());
+#endif
+
+ // Don't just write out the message. This is used to send messages between
+ // NaCl (Posix environment) and the browser (could be on Windows). The message
+ // header formats differ between these systems (so does handle sharing, but
+ // we already asserted we don't have any handles). So just write out the
+ // parts of the header we use.
+ //
+ // Be careful also to use only explicitly-sized types. The NaCl environment
+ // could be 64-bit and the host browser could be 32-bits. The nested message
+ // may or may not be safe to send between 32-bit and 64-bit systems, but we
+ // leave that up to the code sending the message to ensure.
+ m->WriteUInt32(static_cast<uint32>(p.routing_id()));
+ m->WriteUInt32(p.type());
+ m->WriteUInt32(p.flags());
+ m->WriteData(p.payload(), static_cast<uint32>(p.payload_size()));
}
bool ParamTraits<Message>::Read(const Message* m, PickleIterator* iter,
Message* r) {
- int size;
- if (!m->ReadInt(iter, &size))
+ uint32 routing_id, type, flags;
+ if (!m->ReadUInt32(iter, &routing_id) ||
+ !m->ReadUInt32(iter, &type) ||
+ !m->ReadUInt32(iter, &flags))
return false;
- const char* data;
- if (!m->ReadData(iter, &data, &size))
+
+ int payload_size;
+ const char* payload;
+ if (!m->ReadData(iter, &payload, &payload_size))
return false;
- *r = Message(data, size);
- return true;
+
+ r->SetHeaderValues(static_cast<int32>(routing_id), type, flags);
+ return r->WriteBytes(payload, payload_size);
}
void ParamTraits<Message>::Log(const Message& p, std::string* l) {
« no previous file with comments | « ipc/ipc_message.cc ('k') | ipc/ipc_message_utils_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698