OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <sys/mman.h> | 8 #include <sys/mman.h> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
12 #include "base/files/scoped_file.h" | 12 #include "base/files/scoped_file.h" |
13 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
| 14 #include "base/mac/mac_util.h" |
14 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
15 #include "base/memory/shared_memory.h" | 16 #include "base/memory/shared_memory.h" |
16 #include "ipc/attachment_broker_privileged_mac.h" | 17 #include "ipc/attachment_broker_privileged_mac.h" |
17 #include "ipc/attachment_broker_unprivileged_mac.h" | 18 #include "ipc/attachment_broker_unprivileged_mac.h" |
18 #include "ipc/ipc_listener.h" | 19 #include "ipc/ipc_listener.h" |
19 #include "ipc/ipc_message.h" | 20 #include "ipc/ipc_message.h" |
20 #include "ipc/ipc_test_base.h" | 21 #include "ipc/ipc_test_base.h" |
21 #include "ipc/ipc_test_messages.h" | 22 #include "ipc/ipc_test_messages.h" |
22 #include "ipc/test_util_mac.h" | 23 #include "ipc/test_util_mac.h" |
23 | 24 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 return false; | 105 return false; |
105 } | 106 } |
106 | 107 |
107 *handle1 = base::get<0>(p); | 108 *handle1 = base::get<0>(p); |
108 *handle2 = base::get<1>(p); | 109 *handle2 = base::get<1>(p); |
109 return true; | 110 return true; |
110 } | 111 } |
111 | 112 |
112 // Returns |nullptr| on error. | 113 // Returns |nullptr| on error. |
113 scoped_ptr<base::SharedMemory> MapSharedMemoryHandle( | 114 scoped_ptr<base::SharedMemory> MapSharedMemoryHandle( |
114 const base::SharedMemoryHandle& shm) { | 115 const base::SharedMemoryHandle& shm, |
| 116 bool read_only) { |
115 if (!shm.IsValid()) { | 117 if (!shm.IsValid()) { |
116 LOG(ERROR) << "Invalid SharedMemoryHandle"; | 118 LOG(ERROR) << "Invalid SharedMemoryHandle"; |
117 return nullptr; | 119 return nullptr; |
118 } | 120 } |
119 | 121 |
120 size_t size; | 122 size_t size; |
121 if (!shm.GetSize(&size)) { | 123 if (!shm.GetSize(&size)) { |
122 LOG(ERROR) << "Couldn't get size of SharedMemoryHandle"; | 124 LOG(ERROR) << "Couldn't get size of SharedMemoryHandle"; |
123 return nullptr; | 125 return nullptr; |
124 } | 126 } |
125 | 127 |
126 scoped_ptr<base::SharedMemory> shared_memory( | 128 scoped_ptr<base::SharedMemory> shared_memory( |
127 new base::SharedMemory(shm, false)); | 129 new base::SharedMemory(shm, read_only)); |
128 shared_memory->Map(size); | 130 shared_memory->Map(size); |
129 return shared_memory; | 131 return shared_memory; |
130 } | 132 } |
131 | 133 |
132 // This method maps the SharedMemoryHandle, checks the contents, and then | 134 // This method maps the SharedMemoryHandle, checks the contents, and then |
133 // consumes a reference to the underlying Mach port. | 135 // consumes a reference to the underlying Mach port. |
134 bool CheckContentsOfSharedMemoryHandle(const base::SharedMemoryHandle& shm, | 136 bool CheckContentsOfSharedMemoryHandle(const base::SharedMemoryHandle& shm, |
135 const std::string& contents) { | 137 const std::string& contents) { |
136 scoped_ptr<base::SharedMemory> shared_memory(MapSharedMemoryHandle(shm)); | 138 scoped_ptr<base::SharedMemory> shared_memory( |
| 139 MapSharedMemoryHandle(shm, false)); |
137 | 140 |
138 if (memcmp(shared_memory->memory(), contents.c_str(), contents.size()) != 0) { | 141 if (memcmp(shared_memory->memory(), contents.c_str(), contents.size()) != 0) { |
139 LOG(ERROR) << "Shared Memory contents not equivalent"; | 142 LOG(ERROR) << "Shared Memory contents not equivalent"; |
140 return false; | 143 return false; |
141 } | 144 } |
142 return true; | 145 return true; |
143 } | 146 } |
144 | 147 |
145 // This method mmaps the FileDescriptor, checks the contents, and then munmaps | 148 // This method mmaps the FileDescriptor, checks the contents, and then munmaps |
146 // the FileDescriptor and closes the underlying fd. | 149 // the FileDescriptor and closes the underlying fd. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 return base::FileDescriptor(fd_closer.release(), true); | 184 return base::FileDescriptor(fd_closer.release(), true); |
182 } | 185 } |
183 | 186 |
184 // Maps both handles, then checks that their contents matches |contents|. Then | 187 // Maps both handles, then checks that their contents matches |contents|. Then |
185 // checks that changes to one are reflected in the other. Then consumes | 188 // checks that changes to one are reflected in the other. Then consumes |
186 // references to both underlying Mach ports. | 189 // references to both underlying Mach ports. |
187 bool CheckContentsOfTwoEquivalentSharedMemoryHandles( | 190 bool CheckContentsOfTwoEquivalentSharedMemoryHandles( |
188 const base::SharedMemoryHandle& handle1, | 191 const base::SharedMemoryHandle& handle1, |
189 const base::SharedMemoryHandle& handle2, | 192 const base::SharedMemoryHandle& handle2, |
190 const std::string& contents) { | 193 const std::string& contents) { |
191 scoped_ptr<base::SharedMemory> shared_memory1(MapSharedMemoryHandle(handle1)); | 194 scoped_ptr<base::SharedMemory> shared_memory1( |
192 scoped_ptr<base::SharedMemory> shared_memory2(MapSharedMemoryHandle(handle2)); | 195 MapSharedMemoryHandle(handle1, false)); |
| 196 scoped_ptr<base::SharedMemory> shared_memory2( |
| 197 MapSharedMemoryHandle(handle2, false)); |
193 | 198 |
194 if (memcmp(shared_memory1->memory(), contents.c_str(), contents.size()) != | 199 if (memcmp(shared_memory1->memory(), contents.c_str(), contents.size()) != |
195 0) { | 200 0) { |
196 LOG(ERROR) << "Incorrect contents in shared_memory1"; | 201 LOG(ERROR) << "Incorrect contents in shared_memory1"; |
197 return false; | 202 return false; |
198 } | 203 } |
199 | 204 |
200 if (memcmp(shared_memory1->memory(), shared_memory2->memory(), | 205 if (memcmp(shared_memory1->memory(), shared_memory2->memory(), |
201 contents.size()) != 0) { | 206 contents.size()) != 0) { |
202 LOG(ERROR) << "Incorrect contents in shared_memory2"; | 207 LOG(ERROR) << "Incorrect contents in shared_memory2"; |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 LOG(INFO) << "Memory leak!."; | 536 LOG(INFO) << "Memory leak!."; |
532 } | 537 } |
533 LOG(INFO) << "Privileged process end."; | 538 LOG(INFO) << "Privileged process end."; |
534 return 0; | 539 return 0; |
535 } | 540 } |
536 | 541 |
537 // An unprivileged process makes a shared memory region, and writes a string to | 542 // An unprivileged process makes a shared memory region, and writes a string to |
538 // it. The SharedMemoryHandle is sent to the privileged process using Chrome | 543 // it. The SharedMemoryHandle is sent to the privileged process using Chrome |
539 // IPC. The privileged process checks that it received the same memory region. | 544 // IPC. The privileged process checks that it received the same memory region. |
540 TEST_F(IPCAttachmentBrokerMacTest, SendSharedMemoryHandle) { | 545 TEST_F(IPCAttachmentBrokerMacTest, SendSharedMemoryHandle) { |
| 546 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 547 if (base::mac::IsOSSnowLeopard()) |
| 548 return; |
| 549 |
541 CommonSetUp("SendSharedMemoryHandle"); | 550 CommonSetUp("SendSharedMemoryHandle"); |
542 | 551 |
543 SendMessage1(kDataBuffer1); | 552 SendMessage1(kDataBuffer1); |
544 base::MessageLoop::current()->Run(); | 553 base::MessageLoop::current()->Run(); |
545 CommonTearDown(); | 554 CommonTearDown(); |
546 } | 555 } |
547 | 556 |
548 void SendSharedMemoryHandleCallback(IPC::Sender* sender, | 557 void SendSharedMemoryHandleCallback(IPC::Sender* sender, |
549 const IPC::Message& message) { | 558 const IPC::Message& message) { |
550 bool success = CheckContentsOfMessage1(message, kDataBuffer1); | 559 bool success = CheckContentsOfMessage1(message, kDataBuffer1); |
551 SendControlMessage(sender, success); | 560 SendControlMessage(sender, success); |
552 } | 561 } |
553 | 562 |
554 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendSharedMemoryHandle) { | 563 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendSharedMemoryHandle) { |
555 return CommonPrivilegedProcessMain(&SendSharedMemoryHandleCallback, | 564 return CommonPrivilegedProcessMain(&SendSharedMemoryHandleCallback, |
556 "SendSharedMemoryHandle"); | 565 "SendSharedMemoryHandle"); |
557 } | 566 } |
558 | 567 |
559 // Similar to SendSharedMemoryHandle, but sends a very long shared memory | 568 // Similar to SendSharedMemoryHandle, but sends a very long shared memory |
560 // region. | 569 // region. |
561 TEST_F(IPCAttachmentBrokerMacTest, SendSharedMemoryHandleLong) { | 570 TEST_F(IPCAttachmentBrokerMacTest, SendSharedMemoryHandleLong) { |
| 571 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 572 if (base::mac::IsOSSnowLeopard()) |
| 573 return; |
| 574 |
562 CommonSetUp("SendSharedMemoryHandleLong"); | 575 CommonSetUp("SendSharedMemoryHandleLong"); |
563 | 576 |
564 std::string buffer(1 << 23, 'a'); | 577 std::string buffer(1 << 23, 'a'); |
565 SendMessage1(buffer); | 578 SendMessage1(buffer); |
566 base::MessageLoop::current()->Run(); | 579 base::MessageLoop::current()->Run(); |
567 CommonTearDown(); | 580 CommonTearDown(); |
568 } | 581 } |
569 | 582 |
570 void SendSharedMemoryHandleLongCallback(IPC::Sender* sender, | 583 void SendSharedMemoryHandleLongCallback(IPC::Sender* sender, |
571 const IPC::Message& message) { | 584 const IPC::Message& message) { |
572 std::string buffer(1 << 23, 'a'); | 585 std::string buffer(1 << 23, 'a'); |
573 bool success = CheckContentsOfMessage1(message, buffer); | 586 bool success = CheckContentsOfMessage1(message, buffer); |
574 SendControlMessage(sender, success); | 587 SendControlMessage(sender, success); |
575 } | 588 } |
576 | 589 |
577 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendSharedMemoryHandleLong) { | 590 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendSharedMemoryHandleLong) { |
578 return CommonPrivilegedProcessMain(&SendSharedMemoryHandleLongCallback, | 591 return CommonPrivilegedProcessMain(&SendSharedMemoryHandleLongCallback, |
579 "SendSharedMemoryHandleLong"); | 592 "SendSharedMemoryHandleLong"); |
580 } | 593 } |
581 | 594 |
582 // Similar to SendSharedMemoryHandle, but sends two different shared memory | 595 // Similar to SendSharedMemoryHandle, but sends two different shared memory |
583 // regions in two messages. | 596 // regions in two messages. |
584 TEST_F(IPCAttachmentBrokerMacTest, SendTwoMessagesDifferentSharedMemoryHandle) { | 597 TEST_F(IPCAttachmentBrokerMacTest, SendTwoMessagesDifferentSharedMemoryHandle) { |
| 598 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 599 if (base::mac::IsOSSnowLeopard()) |
| 600 return; |
| 601 |
585 CommonSetUp("SendTwoMessagesDifferentSharedMemoryHandle"); | 602 CommonSetUp("SendTwoMessagesDifferentSharedMemoryHandle"); |
586 | 603 |
587 SendMessage1(kDataBuffer1); | 604 SendMessage1(kDataBuffer1); |
588 SendMessage1(kDataBuffer2); | 605 SendMessage1(kDataBuffer2); |
589 base::MessageLoop::current()->Run(); | 606 base::MessageLoop::current()->Run(); |
590 CommonTearDown(); | 607 CommonTearDown(); |
591 } | 608 } |
592 | 609 |
593 void SendTwoMessagesDifferentSharedMemoryHandleCallback( | 610 void SendTwoMessagesDifferentSharedMemoryHandleCallback( |
594 IPC::Sender* sender, | 611 IPC::Sender* sender, |
(...skipping 11 matching lines...) Expand all Loading... |
606 | 623 |
607 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendTwoMessagesDifferentSharedMemoryHandle) { | 624 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendTwoMessagesDifferentSharedMemoryHandle) { |
608 return CommonPrivilegedProcessMain( | 625 return CommonPrivilegedProcessMain( |
609 &SendTwoMessagesDifferentSharedMemoryHandleCallback, | 626 &SendTwoMessagesDifferentSharedMemoryHandleCallback, |
610 "SendTwoMessagesDifferentSharedMemoryHandle"); | 627 "SendTwoMessagesDifferentSharedMemoryHandle"); |
611 } | 628 } |
612 | 629 |
613 // Similar to SendSharedMemoryHandle, but sends the same shared memory region in | 630 // Similar to SendSharedMemoryHandle, but sends the same shared memory region in |
614 // two messages. | 631 // two messages. |
615 TEST_F(IPCAttachmentBrokerMacTest, SendTwoMessagesSameSharedMemoryHandle) { | 632 TEST_F(IPCAttachmentBrokerMacTest, SendTwoMessagesSameSharedMemoryHandle) { |
| 633 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 634 if (base::mac::IsOSSnowLeopard()) |
| 635 return; |
| 636 |
616 CommonSetUp("SendTwoMessagesSameSharedMemoryHandle"); | 637 CommonSetUp("SendTwoMessagesSameSharedMemoryHandle"); |
617 | 638 |
618 { | 639 { |
619 scoped_ptr<base::SharedMemory> shared_memory( | 640 scoped_ptr<base::SharedMemory> shared_memory( |
620 MakeSharedMemory(kDataBuffer1)); | 641 MakeSharedMemory(kDataBuffer1)); |
621 | 642 |
622 for (int i = 0; i < 2; ++i) { | 643 for (int i = 0; i < 2; ++i) { |
623 IPC::Message* message = | 644 IPC::Message* message = |
624 new TestSharedMemoryHandleMsg1(100, shared_memory->handle(), 200); | 645 new TestSharedMemoryHandleMsg1(100, shared_memory->handle(), 200); |
625 sender()->Send(message); | 646 sender()->Send(message); |
(...skipping 25 matching lines...) Expand all Loading... |
651 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendTwoMessagesSameSharedMemoryHandle) { | 672 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendTwoMessagesSameSharedMemoryHandle) { |
652 return CommonPrivilegedProcessMain( | 673 return CommonPrivilegedProcessMain( |
653 &SendTwoMessagesSameSharedMemoryHandleCallback, | 674 &SendTwoMessagesSameSharedMemoryHandleCallback, |
654 "SendTwoMessagesSameSharedMemoryHandle"); | 675 "SendTwoMessagesSameSharedMemoryHandle"); |
655 } | 676 } |
656 | 677 |
657 // Similar to SendSharedMemoryHandle, but sends one message with two different | 678 // Similar to SendSharedMemoryHandle, but sends one message with two different |
658 // memory regions. | 679 // memory regions. |
659 TEST_F(IPCAttachmentBrokerMacTest, | 680 TEST_F(IPCAttachmentBrokerMacTest, |
660 SendOneMessageWithTwoDifferentSharedMemoryHandles) { | 681 SendOneMessageWithTwoDifferentSharedMemoryHandles) { |
| 682 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 683 if (base::mac::IsOSSnowLeopard()) |
| 684 return; |
| 685 |
661 CommonSetUp("SendOneMessageWithTwoDifferentSharedMemoryHandles"); | 686 CommonSetUp("SendOneMessageWithTwoDifferentSharedMemoryHandles"); |
662 | 687 |
663 { | 688 { |
664 scoped_ptr<base::SharedMemory> shared_memory1( | 689 scoped_ptr<base::SharedMemory> shared_memory1( |
665 MakeSharedMemory(kDataBuffer1)); | 690 MakeSharedMemory(kDataBuffer1)); |
666 scoped_ptr<base::SharedMemory> shared_memory2( | 691 scoped_ptr<base::SharedMemory> shared_memory2( |
667 MakeSharedMemory(kDataBuffer2)); | 692 MakeSharedMemory(kDataBuffer2)); |
668 IPC::Message* message = new TestSharedMemoryHandleMsg2( | 693 IPC::Message* message = new TestSharedMemoryHandleMsg2( |
669 shared_memory1->handle(), shared_memory2->handle()); | 694 shared_memory1->handle(), shared_memory2->handle()); |
670 sender()->Send(message); | 695 sender()->Send(message); |
(...skipping 22 matching lines...) Expand all Loading... |
693 SendOneMessageWithTwoDifferentSharedMemoryHandles) { | 718 SendOneMessageWithTwoDifferentSharedMemoryHandles) { |
694 return CommonPrivilegedProcessMain( | 719 return CommonPrivilegedProcessMain( |
695 &SendOneMessageWithTwoDifferentSharedMemoryHandlesCallback, | 720 &SendOneMessageWithTwoDifferentSharedMemoryHandlesCallback, |
696 "SendOneMessageWithTwoDifferentSharedMemoryHandles"); | 721 "SendOneMessageWithTwoDifferentSharedMemoryHandles"); |
697 } | 722 } |
698 | 723 |
699 // Similar to SendSharedMemoryHandle, but sends one message that contains the | 724 // Similar to SendSharedMemoryHandle, but sends one message that contains the |
700 // same memory region twice. | 725 // same memory region twice. |
701 TEST_F(IPCAttachmentBrokerMacTest, | 726 TEST_F(IPCAttachmentBrokerMacTest, |
702 SendOneMessageWithTwoSameSharedMemoryHandles) { | 727 SendOneMessageWithTwoSameSharedMemoryHandles) { |
| 728 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 729 if (base::mac::IsOSSnowLeopard()) |
| 730 return; |
| 731 |
703 CommonSetUp("SendOneMessageWithTwoSameSharedMemoryHandles"); | 732 CommonSetUp("SendOneMessageWithTwoSameSharedMemoryHandles"); |
704 | 733 |
705 { | 734 { |
706 scoped_ptr<base::SharedMemory> shared_memory( | 735 scoped_ptr<base::SharedMemory> shared_memory( |
707 MakeSharedMemory(kDataBuffer1)); | 736 MakeSharedMemory(kDataBuffer1)); |
708 IPC::Message* message = new TestSharedMemoryHandleMsg2( | 737 IPC::Message* message = new TestSharedMemoryHandleMsg2( |
709 shared_memory->handle(), shared_memory->handle()); | 738 shared_memory->handle(), shared_memory->handle()); |
710 sender()->Send(message); | 739 sender()->Send(message); |
711 } | 740 } |
712 base::MessageLoop::current()->Run(); | 741 base::MessageLoop::current()->Run(); |
(...skipping 18 matching lines...) Expand all Loading... |
731 | 760 |
732 MULTIPROCESS_IPC_TEST_CLIENT_MAIN( | 761 MULTIPROCESS_IPC_TEST_CLIENT_MAIN( |
733 SendOneMessageWithTwoSameSharedMemoryHandles) { | 762 SendOneMessageWithTwoSameSharedMemoryHandles) { |
734 return CommonPrivilegedProcessMain( | 763 return CommonPrivilegedProcessMain( |
735 &SendOneMessageWithTwoSameSharedMemoryHandlesCallback, | 764 &SendOneMessageWithTwoSameSharedMemoryHandlesCallback, |
736 "SendOneMessageWithTwoSameSharedMemoryHandles"); | 765 "SendOneMessageWithTwoSameSharedMemoryHandles"); |
737 } | 766 } |
738 | 767 |
739 // Sends one message with two Posix FDs and two Mach ports. | 768 // Sends one message with two Posix FDs and two Mach ports. |
740 TEST_F(IPCAttachmentBrokerMacTest, SendPosixFDAndMachPort) { | 769 TEST_F(IPCAttachmentBrokerMacTest, SendPosixFDAndMachPort) { |
| 770 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 771 if (base::mac::IsOSSnowLeopard()) |
| 772 return; |
| 773 |
741 base::ScopedTempDir temp_dir; | 774 base::ScopedTempDir temp_dir; |
742 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 775 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
743 base::FilePath fp1, fp2; | 776 base::FilePath fp1, fp2; |
744 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &fp1)); | 777 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &fp1)); |
745 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &fp2)); | 778 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.path(), &fp2)); |
746 | 779 |
747 CommonSetUp("SendPosixFDAndMachPort"); | 780 CommonSetUp("SendPosixFDAndMachPort"); |
748 | 781 |
749 { | 782 { |
750 scoped_ptr<base::SharedMemory> shared_memory1( | 783 scoped_ptr<base::SharedMemory> shared_memory1( |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 | 827 |
795 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendPosixFDAndMachPort) { | 828 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendPosixFDAndMachPort) { |
796 return CommonPrivilegedProcessMain(&SendPosixFDAndMachPortCallback, | 829 return CommonPrivilegedProcessMain(&SendPosixFDAndMachPortCallback, |
797 "SendPosixFDAndMachPort"); | 830 "SendPosixFDAndMachPort"); |
798 } | 831 } |
799 | 832 |
800 // Similar to SendHandle, except the attachment's destination process is this | 833 // Similar to SendHandle, except the attachment's destination process is this |
801 // process. This is an unrealistic scenario, but simulates an unprivileged | 834 // process. This is an unrealistic scenario, but simulates an unprivileged |
802 // process sending an attachment to another unprivileged process. | 835 // process sending an attachment to another unprivileged process. |
803 TEST_F(IPCAttachmentBrokerMacTest, SendSharedMemoryHandleToSelf) { | 836 TEST_F(IPCAttachmentBrokerMacTest, SendSharedMemoryHandleToSelf) { |
| 837 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 838 if (base::mac::IsOSSnowLeopard()) |
| 839 return; |
| 840 |
804 SetBroker(new MockBroker); | 841 SetBroker(new MockBroker); |
805 CommonSetUp("SendSharedMemoryHandleToSelf"); | 842 CommonSetUp("SendSharedMemoryHandleToSelf"); |
806 | 843 |
807 // Technically, the channel is an endpoint, but we need the proxy listener to | 844 // Technically, the channel is an endpoint, but we need the proxy listener to |
808 // receive the messages so that it can quit the message loop. | 845 // receive the messages so that it can quit the message loop. |
809 channel()->SetAttachmentBrokerEndpoint(false); | 846 channel()->SetAttachmentBrokerEndpoint(false); |
810 get_proxy_listener()->set_listener(get_broker()); | 847 get_proxy_listener()->set_listener(get_broker()); |
811 | 848 |
812 { | 849 { |
813 scoped_ptr<base::SharedMemory> shared_memory( | 850 scoped_ptr<base::SharedMemory> shared_memory( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 } | 882 } |
846 | 883 |
847 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendSharedMemoryHandleToSelf) { | 884 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendSharedMemoryHandleToSelf) { |
848 return CommonPrivilegedProcessMain(&SendSharedMemoryHandleToSelfCallback, | 885 return CommonPrivilegedProcessMain(&SendSharedMemoryHandleToSelfCallback, |
849 "SendSharedMemoryHandleToSelf"); | 886 "SendSharedMemoryHandleToSelf"); |
850 } | 887 } |
851 | 888 |
852 // Similar to SendSharedMemoryHandle, but uses a ChannelProxy instead of a | 889 // Similar to SendSharedMemoryHandle, but uses a ChannelProxy instead of a |
853 // Channel. | 890 // Channel. |
854 TEST_F(IPCAttachmentBrokerMacTest, SendSharedMemoryHandleChannelProxy) { | 891 TEST_F(IPCAttachmentBrokerMacTest, SendSharedMemoryHandleChannelProxy) { |
| 892 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 893 if (base::mac::IsOSSnowLeopard()) |
| 894 return; |
| 895 |
855 Init("SendSharedMemoryHandleChannelProxy"); | 896 Init("SendSharedMemoryHandleChannelProxy"); |
856 MachPreForkSetUp(); | 897 MachPreForkSetUp(); |
857 | 898 |
858 SetBroker(new IPC::AttachmentBrokerUnprivilegedMac); | 899 SetBroker(new IPC::AttachmentBrokerUnprivilegedMac); |
859 get_broker()->AddObserver(get_observer()); | 900 get_broker()->AddObserver(get_observer()); |
860 | 901 |
861 scoped_ptr<base::Thread> thread( | 902 scoped_ptr<base::Thread> thread( |
862 new base::Thread("ChannelProxyTestServerThread")); | 903 new base::Thread("ChannelProxyTestServerThread")); |
863 base::Thread::Options options; | 904 base::Thread::Options options; |
864 options.message_loop_type = base::MessageLoop::TYPE_IO; | 905 options.message_loop_type = base::MessageLoop::TYPE_IO; |
(...skipping 28 matching lines...) Expand all Loading... |
893 bool success = CheckContentsOfMessage1(message, kDataBuffer1); | 934 bool success = CheckContentsOfMessage1(message, kDataBuffer1); |
894 SendControlMessage(sender, success); | 935 SendControlMessage(sender, success); |
895 } | 936 } |
896 | 937 |
897 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendSharedMemoryHandleChannelProxy) { | 938 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(SendSharedMemoryHandleChannelProxy) { |
898 return CommonPrivilegedProcessMain( | 939 return CommonPrivilegedProcessMain( |
899 &SendSharedMemoryHandleChannelProxyCallback, | 940 &SendSharedMemoryHandleChannelProxyCallback, |
900 "SendSharedMemoryHandleChannelProxy"); | 941 "SendSharedMemoryHandleChannelProxy"); |
901 } | 942 } |
902 | 943 |
| 944 // Similar to SendSharedMemoryHandle, but first makes a copy of the handle using |
| 945 // ShareToProcess(). |
| 946 TEST_F(IPCAttachmentBrokerMacTest, ShareToProcess) { |
| 947 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 948 if (base::mac::IsOSSnowLeopard()) |
| 949 return; |
| 950 |
| 951 CommonSetUp("ShareToProcess"); |
| 952 |
| 953 { |
| 954 scoped_ptr<base::SharedMemory> shared_memory( |
| 955 MakeSharedMemory(kDataBuffer1)); |
| 956 base::SharedMemoryHandle new_handle; |
| 957 ASSERT_TRUE(shared_memory->ShareToProcess(0, &new_handle)); |
| 958 IPC::Message* message = |
| 959 new TestSharedMemoryHandleMsg1(100, new_handle, 200); |
| 960 sender()->Send(message); |
| 961 } |
| 962 |
| 963 base::MessageLoop::current()->Run(); |
| 964 CommonTearDown(); |
| 965 } |
| 966 |
| 967 void ShareToProcessCallback(IPC::Sender* sender, const IPC::Message& message) { |
| 968 bool success = CheckContentsOfMessage1(message, kDataBuffer1); |
| 969 SendControlMessage(sender, success); |
| 970 } |
| 971 |
| 972 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(ShareToProcess) { |
| 973 return CommonPrivilegedProcessMain(&ShareToProcessCallback, "ShareToProcess"); |
| 974 } |
| 975 |
| 976 // Similar to ShareToProcess, but instead shares the memory object only with |
| 977 // read permissions. |
| 978 TEST_F(IPCAttachmentBrokerMacTest, ShareReadOnlyToProcess) { |
| 979 // Mach-based SharedMemory isn't support on OSX 10.6. |
| 980 if (base::mac::IsOSSnowLeopard()) |
| 981 return; |
| 982 |
| 983 CommonSetUp("ShareReadOnlyToProcess"); |
| 984 |
| 985 { |
| 986 scoped_ptr<base::SharedMemory> shared_memory( |
| 987 MakeSharedMemory(kDataBuffer1)); |
| 988 base::SharedMemoryHandle new_handle; |
| 989 ASSERT_TRUE(shared_memory->ShareReadOnlyToProcess(0, &new_handle)); |
| 990 IPC::Message* message = |
| 991 new TestSharedMemoryHandleMsg1(100, new_handle, 200); |
| 992 sender()->Send(message); |
| 993 } |
| 994 |
| 995 base::MessageLoop::current()->Run(); |
| 996 CommonTearDown(); |
| 997 } |
| 998 |
| 999 void ShareReadOnlyToProcessCallback(IPC::Sender* sender, |
| 1000 const IPC::Message& message) { |
| 1001 base::SharedMemoryHandle shm(GetSharedMemoryHandleFromMsg1(message)); |
| 1002 |
| 1003 // Try to map the memory as writable. |
| 1004 scoped_ptr<base::SharedMemory> shared_memory( |
| 1005 MapSharedMemoryHandle(shm, false)); |
| 1006 ASSERT_EQ(nullptr, shared_memory->memory()); |
| 1007 |
| 1008 // Now try as read-only. |
| 1009 scoped_ptr<base::SharedMemory> shared_memory2( |
| 1010 MapSharedMemoryHandle(shm.Duplicate(), true)); |
| 1011 int current_prot, max_prot; |
| 1012 ASSERT_TRUE(IPC::GetMachProtections(shared_memory2->memory(), |
| 1013 shared_memory2->mapped_size(), |
| 1014 ¤t_prot, &max_prot)); |
| 1015 ASSERT_EQ(VM_PROT_READ, current_prot); |
| 1016 ASSERT_EQ(VM_PROT_READ, max_prot); |
| 1017 |
| 1018 bool success = |
| 1019 memcmp(shared_memory2->memory(), kDataBuffer1, strlen(kDataBuffer1)) == 0; |
| 1020 SendControlMessage(sender, success); |
| 1021 } |
| 1022 |
| 1023 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(ShareReadOnlyToProcess) { |
| 1024 return CommonPrivilegedProcessMain(&ShareReadOnlyToProcessCallback, |
| 1025 "ShareReadOnlyToProcess"); |
| 1026 } |
| 1027 |
903 } // namespace | 1028 } // namespace |
OLD | NEW |