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

Side by Side Diff: ipc/ipc_message_utils.cc

Issue 2555483002: Add POSIX shared memory support for Mac (Closed)
Patch Set: Check that we never pass POSIX shm over Mojo. Created 4 years 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ipc/ipc_message_utils.h" 5 #include "ipc/ipc_message_utils.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 #if defined(OS_MACOSX) && !defined(OS_IOS) 683 #if defined(OS_MACOSX) && !defined(OS_IOS)
684 void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer, 684 void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer,
685 const param_type& p) { 685 const param_type& p) {
686 GetParamSize(sizer, p.GetMemoryObject()); 686 GetParamSize(sizer, p.GetMemoryObject());
687 uint32_t dummy = 0; 687 uint32_t dummy = 0;
688 GetParamSize(sizer, dummy); 688 GetParamSize(sizer, dummy);
689 } 689 }
690 690
691 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m, 691 void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
692 const param_type& p) { 692 const param_type& p) {
693 MachPortMac mach_port_mac(p.GetMemoryObject()); 693 m->WriteInt(p.GetType());
694 ParamTraits<MachPortMac>::Write(m, mach_port_mac);
695 size_t size = 0;
696 bool result = p.GetSize(&size);
697 DCHECK(result);
698 ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size));
699 694
700 // If the caller intended to pass ownership to the IPC stack, release a 695 switch (p.GetType()) {
701 // reference. 696 case base::SharedMemoryHandle::POSIX:
702 if (p.OwnershipPassesToIPC()) 697 // We should never pass POSIX shared memory over IPC.
703 p.Close(); 698 CHECK(false);
699 break;
700 case base::SharedMemoryHandle::MACH:
701 MachPortMac mach_port_mac(p.GetMemoryObject());
702 ParamTraits<MachPortMac>::Write(m, mach_port_mac);
703 size_t size = 0;
704 bool result = p.GetSize(&size);
705 DCHECK(result);
706 ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size));
707
708 // If the caller intended to pass ownership to the IPC stack, release a
709 // reference.
710 if (p.OwnershipPassesToIPC())
711 p.Close();
712
713 break;
714 }
704 } 715 }
705 716
706 bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m, 717 bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
707 base::PickleIterator* iter, 718 base::PickleIterator* iter,
708 param_type* r) { 719 param_type* r) {
720 base::SharedMemoryHandle::TypeWireFormat type;
721 if (!iter->ReadInt(&type))
722 return false;
723
724 if (type == base::SharedMemoryHandle::POSIX) {
725 // We should never pass POSIX shared memory over IPC.
726 CHECK(false);
727 return false;
728 }
729
709 MachPortMac mach_port_mac; 730 MachPortMac mach_port_mac;
710 if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac)) 731 if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac))
711 return false; 732 return false;
712 733
713 uint32_t size; 734 uint32_t size;
714 if (!ParamTraits<uint32_t>::Read(m, iter, &size)) 735 if (!ParamTraits<uint32_t>::Read(m, iter, &size))
715 return false; 736 return false;
716 737
717 *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(), 738 *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(),
718 static_cast<size_t>(size), 739 static_cast<size_t>(size),
719 base::GetCurrentProcId()); 740 base::GetCurrentProcId());
720 return true; 741 return true;
721 } 742 }
722 743
723 void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p, 744 void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
724 std::string* l) { 745 std::string* l) {
725 l->append("Mach port: "); 746 switch (p.GetType()) {
726 LogParam(p.GetMemoryObject(), l); 747 case base::SharedMemoryHandle::POSIX:
748 // We should never pass POSIX shared memory over IPC.
749 CHECK(false);
750 break;
751 case base::SharedMemoryHandle::MACH:
752 l->append("Mach port: ");
753 LogParam(p.GetMemoryObject(), l);
754 break;
755 }
727 } 756 }
728 757
729 #elif defined(OS_WIN) 758 #elif defined(OS_WIN)
730 void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* s, 759 void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* s,
731 const param_type& p) { 760 const param_type& p) {
732 GetParamSize(s, p.NeedsBrokering()); 761 GetParamSize(s, p.NeedsBrokering());
733 if (p.NeedsBrokering()) { 762 if (p.NeedsBrokering()) {
734 GetParamSize(s, p.GetHandle()); 763 GetParamSize(s, p.GetHandle());
735 } else { 764 } else {
736 GetParamSize(s, HandleToLong(p.GetHandle())); 765 GetParamSize(s, HandleToLong(p.GetHandle()));
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 return result; 1260 return result;
1232 } 1261 }
1233 1262
1234 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) { 1263 void ParamTraits<MSG>::Log(const param_type& p, std::string* l) {
1235 l->append("<MSG>"); 1264 l->append("<MSG>");
1236 } 1265 }
1237 1266
1238 #endif // OS_WIN 1267 #endif // OS_WIN
1239 1268
1240 } // namespace IPC 1269 } // namespace IPC
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698