| Index: ipc/ipc_message_utils.cc
|
| diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
|
| index a173226180bbaaac51b926fba76ca9962c0a80b6..e8aeee4bda4343ce5055e781136b2537ac61bd71 100644
|
| --- a/ipc/ipc_message_utils.cc
|
| +++ b/ipc/ipc_message_utils.cc
|
| @@ -620,6 +620,8 @@ void ParamTraits<base::FileDescriptor>::GetSize(base::PickleSizer* sizer,
|
|
|
| void ParamTraits<base::FileDescriptor>::Write(base::Pickle* m,
|
| const param_type& p) {
|
| + // This serialization must be kept in sync with
|
| + // nacl_ipc_adapater.cc:WriteHandle().
|
| const bool valid = p.fd >= 0;
|
| WriteParam(m, valid);
|
|
|
| @@ -677,15 +679,28 @@ void ParamTraits<base::FileDescriptor>::Log(const param_type& p,
|
| #if defined(OS_MACOSX) && !defined(OS_IOS)
|
| void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer,
|
| const param_type& p) {
|
| - GetParamSize(sizer, p.GetMemoryObject());
|
| - uint32_t dummy = 0;
|
| - GetParamSize(sizer, dummy);
|
| + GetParamSize(sizer, p.IsValid());
|
| + if (p.IsValid()) {
|
| + GetParamSize(sizer, p.GetMemoryObject());
|
| + GetParamSize(sizer, p.GetGUID());
|
| + uint32_t dummy = 0;
|
| + GetParamSize(sizer, dummy);
|
| + }
|
| }
|
|
|
| void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
|
| const param_type& p) {
|
| + const bool valid = p.IsValid();
|
| + WriteParam(m, valid);
|
| +
|
| + if (!valid)
|
| + return;
|
| +
|
| MachPortMac mach_port_mac(p.GetMemoryObject());
|
| - ParamTraits<MachPortMac>::Write(m, mach_port_mac);
|
| + WriteParam(m, mach_port_mac);
|
| + DCHECK(!p.GetGUID().is_empty());
|
| + WriteParam(m, p.GetGUID());
|
| +
|
| size_t size = 0;
|
| bool result = p.GetSize(&size);
|
| DCHECK(result);
|
| @@ -700,8 +715,20 @@ void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
|
| bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
|
| base::PickleIterator* iter,
|
| param_type* r) {
|
| + *r = base::SharedMemoryHandle();
|
| +
|
| + bool valid;
|
| + if (!ReadParam(m, iter, &valid))
|
| + return false;
|
| + if (!valid)
|
| + return true;
|
| +
|
| MachPortMac mach_port_mac;
|
| - if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac))
|
| + if (!ReadParam(m, iter, &mach_port_mac))
|
| + return false;
|
| +
|
| + base::UnguessableToken guid;
|
| + if (!ReadParam(m, iter, &guid))
|
| return false;
|
|
|
| uint32_t size;
|
| @@ -709,7 +736,7 @@ bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
|
| return false;
|
|
|
| *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(),
|
| - static_cast<size_t>(size));
|
| + static_cast<size_t>(size), guid);
|
| return true;
|
| }
|
|
|
| @@ -717,14 +744,18 @@ void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
|
| std::string* l) {
|
| l->append("Mach port: ");
|
| LogParam(p.GetMemoryObject(), l);
|
| + l->append("GUID: ");
|
| + ParamTraits<base::UnguessableToken>::Log(p.GetGUID(), l);
|
| }
|
|
|
| #elif defined(OS_WIN)
|
| void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* s,
|
| const param_type& p) {
|
| GetParamSize(s, p.IsValid());
|
| - if (p.IsValid())
|
| + if (p.IsValid()) {
|
| GetParamSize(s, p.GetHandle());
|
| + GetParamSize(s, p.GetGUID());
|
| + }
|
| }
|
|
|
| void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
|
| @@ -736,12 +767,15 @@ void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
|
| return;
|
|
|
| HandleWin handle_win(p.GetHandle(), HandleWin::DUPLICATE);
|
| - ParamTraits<HandleWin>::Write(m, handle_win);
|
| + WriteParam(m, handle_win);
|
|
|
| // If the caller intended to pass ownership to the IPC stack, release a
|
| // reference.
|
| if (p.OwnershipPassesToIPC())
|
| p.Close();
|
| +
|
| + DCHECK(!p.GetGUID().is_empty());
|
| + WriteParam(m, p.GetGUID());
|
| }
|
|
|
| bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
|
| @@ -756,26 +790,38 @@ bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
|
| return true;
|
|
|
| HandleWin handle_win;
|
| - if (!ParamTraits<HandleWin>::Read(m, iter, &handle_win))
|
| + if (!ReadParam(m, iter, &handle_win))
|
| + return false;
|
| +
|
| + base::UnguessableToken guid;
|
| + if (!ReadParam(m, iter, &guid))
|
| return false;
|
| - *r = base::SharedMemoryHandle(handle_win.get_handle());
|
| +
|
| + *r = base::SharedMemoryHandle(handle_win.get_handle(), guid);
|
| return true;
|
| }
|
|
|
| void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
|
| std::string* l) {
|
| + l->append("HANDLE: ");
|
| LogParam(p.GetHandle(), l);
|
| + l->append("GUID: ");
|
| + ParamTraits<base::UnguessableToken>::Log(p.GetGUID(), l);
|
| }
|
| #elif defined(OS_POSIX)
|
| void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer,
|
| const param_type& p) {
|
| GetParamSize(sizer, p.IsValid());
|
| - if (p.IsValid())
|
| + if (p.IsValid()) {
|
| sizer->AddAttachment();
|
| + GetParamSize(sizer, p.GetGUID());
|
| + }
|
| }
|
|
|
| void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
|
| const param_type& p) {
|
| + // This serialization must be kept in sync with
|
| + // nacl_ipc_adapater.cc:WriteHandle().
|
| const bool valid = p.IsValid();
|
| WriteParam(m, valid);
|
|
|
| @@ -791,6 +837,8 @@ void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
|
| new internal::PlatformFileAttachment(p.GetHandle())))
|
| NOTREACHED();
|
| }
|
| + DCHECK(!p.GetGUID().is_empty());
|
| + WriteParam(m, p.GetGUID());
|
| }
|
|
|
| bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
|
| @@ -814,10 +862,16 @@ bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
|
| return false;
|
| }
|
|
|
| - *r = base::SharedMemoryHandle(base::FileDescriptor(
|
| - static_cast<internal::PlatformFileAttachment*>(attachment.get())
|
| - ->TakePlatformFile(),
|
| - true));
|
| + base::UnguessableToken guid;
|
| + if (!ReadParam(m, iter, &guid))
|
| + return false;
|
| +
|
| + *r = base::SharedMemoryHandle(
|
| + base::FileDescriptor(
|
| + static_cast<internal::PlatformFileAttachment*>(attachment.get())
|
| + ->TakePlatformFile(),
|
| + true),
|
| + guid);
|
| return true;
|
| }
|
|
|
| @@ -828,6 +882,8 @@ void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
|
| } else {
|
| l->append(base::StringPrintf("FD(%d)", p.GetHandle()));
|
| }
|
| + l->append("GUID: ");
|
| + ParamTraits<base::UnguessableToken>::Log(p.GetGUID(), l);
|
| }
|
| #endif // defined(OS_MACOSX) && !defined(OS_IOS)
|
|
|
| @@ -1086,6 +1142,8 @@ void ParamTraits<base::UnguessableToken>::Write(base::Pickle* m,
|
| const param_type& p) {
|
| DCHECK(!p.is_empty());
|
|
|
| + // This serialization must be kept in sync with
|
| + // nacl_ipc_adapater.cc:WriteHandle().
|
| ParamTraits<uint64_t>::Write(m, p.GetHighForSerialization());
|
| ParamTraits<uint64_t>::Write(m, p.GetLowForSerialization());
|
| }
|
|
|