| OLD | NEW |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 | 91 |
| 92 // Set up the parent port and register it with the bootstrap server before | 92 // Set up the parent port and register it with the bootstrap server before |
| 93 // forking, so that it’s guaranteed to be there when the child attempts to | 93 // forking, so that it’s guaranteed to be there when the child attempts to |
| 94 // look it up. | 94 // look it up. |
| 95 info_->service_name = "com.googlecode.crashpad.test.mach_multiprocess."; | 95 info_->service_name = "com.googlecode.crashpad.test.mach_multiprocess."; |
| 96 for (int index = 0; index < 16; ++index) { | 96 for (int index = 0; index < 16; ++index) { |
| 97 info_->service_name.append(1, base::RandInt('A', 'Z')); | 97 info_->service_name.append(1, base::RandInt('A', 'Z')); |
| 98 } | 98 } |
| 99 | 99 |
| 100 info_->local_port = BootstrapCheckIn(info_->service_name); | 100 info_->local_port = BootstrapCheckIn(info_->service_name); |
| 101 ASSERT_NE(kMachPortNull, info_->local_port); | 101 ASSERT_TRUE(info_->local_port.is_valid()); |
| 102 } | 102 } |
| 103 | 103 |
| 104 mach_port_t MachMultiprocess::LocalPort() const { | 104 mach_port_t MachMultiprocess::LocalPort() const { |
| 105 EXPECT_NE(kMachPortNull, info_->local_port); | 105 EXPECT_TRUE(info_->local_port.is_valid()); |
| 106 return info_->local_port; | 106 return info_->local_port.get(); |
| 107 } | 107 } |
| 108 | 108 |
| 109 mach_port_t MachMultiprocess::RemotePort() const { | 109 mach_port_t MachMultiprocess::RemotePort() const { |
| 110 EXPECT_NE(kMachPortNull, info_->remote_port); | 110 EXPECT_TRUE(info_->remote_port.is_valid()); |
| 111 return info_->remote_port; | 111 return info_->remote_port.get(); |
| 112 } | 112 } |
| 113 | 113 |
| 114 task_t MachMultiprocess::ChildTask() const { | 114 task_t MachMultiprocess::ChildTask() const { |
| 115 EXPECT_NE(TASK_NULL, info_->child_task); | 115 EXPECT_TRUE(info_->child_task.is_valid()); |
| 116 return info_->child_task; | 116 return info_->child_task.get(); |
| 117 } | 117 } |
| 118 | 118 |
| 119 void MachMultiprocess::MultiprocessParent() { | 119 void MachMultiprocess::MultiprocessParent() { |
| 120 ReceiveHelloMessage message = {}; | 120 ReceiveHelloMessage message = {}; |
| 121 | 121 |
| 122 kern_return_t kr = mach_msg(&message.header, | 122 kern_return_t kr = mach_msg(&message.header, |
| 123 MACH_RCV_MSG | kMachMessageReceiveAuditTrailer, | 123 MACH_RCV_MSG | kMachMessageReceiveAuditTrailer, |
| 124 0, | 124 0, |
| 125 sizeof(message), | 125 sizeof(message), |
| 126 info_->local_port, | 126 info_->local_port.get(), |
| 127 MACH_MSG_TIMEOUT_NONE, | 127 MACH_MSG_TIMEOUT_NONE, |
| 128 MACH_PORT_NULL); | 128 MACH_PORT_NULL); |
| 129 ASSERT_EQ(MACH_MSG_SUCCESS, kr) << MachErrorMessage(kr, "mach_msg"); | 129 ASSERT_EQ(MACH_MSG_SUCCESS, kr) << MachErrorMessage(kr, "mach_msg"); |
| 130 | 130 |
| 131 // Comb through the entire message, checking every field against its expected | 131 // Comb through the entire message, checking every field against its expected |
| 132 // value. | 132 // value. |
| 133 EXPECT_EQ(MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND, MACH_MSG_TYPE_MOVE_SEND) | | 133 EXPECT_EQ(MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND, MACH_MSG_TYPE_MOVE_SEND) | |
| 134 MACH_MSGH_BITS_COMPLEX, | 134 MACH_MSGH_BITS_COMPLEX, |
| 135 message.header.msgh_bits); | 135 message.header.msgh_bits); |
| 136 ASSERT_EQ(sizeof(SendHelloMessage), message.header.msgh_size); | 136 ASSERT_EQ(sizeof(SendHelloMessage), message.header.msgh_size); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 EXPECT_EQ(audit_info.ai_auid, audit_auid); | 191 EXPECT_EQ(audit_info.ai_auid, audit_auid); |
| 192 EXPECT_EQ(audit_info.ai_asid, audit_asid); | 192 EXPECT_EQ(audit_info.ai_asid, audit_asid); |
| 193 | 193 |
| 194 // Retrieve the remote port from the message header, and the child’s task port | 194 // Retrieve the remote port from the message header, and the child’s task port |
| 195 // from the message body. | 195 // from the message body. |
| 196 info_->remote_port.reset(message.header.msgh_remote_port); | 196 info_->remote_port.reset(message.header.msgh_remote_port); |
| 197 info_->child_task.reset(message.port_descriptor.name); | 197 info_->child_task.reset(message.port_descriptor.name); |
| 198 | 198 |
| 199 // Verify that the child’s task port is what it purports to be. | 199 // Verify that the child’s task port is what it purports to be. |
| 200 int mach_pid; | 200 int mach_pid; |
| 201 kr = pid_for_task(info_->child_task, &mach_pid); | 201 kr = pid_for_task(info_->child_task.get(), &mach_pid); |
| 202 ASSERT_EQ(KERN_SUCCESS, kr) << MachErrorMessage(kr, "pid_for_task"); | 202 ASSERT_EQ(KERN_SUCCESS, kr) << MachErrorMessage(kr, "pid_for_task"); |
| 203 ASSERT_EQ(ChildPID(), mach_pid); | 203 ASSERT_EQ(ChildPID(), mach_pid); |
| 204 | 204 |
| 205 MachMultiprocessParent(); | 205 MachMultiprocessParent(); |
| 206 | 206 |
| 207 info_->remote_port.reset(); | 207 info_->remote_port.reset(); |
| 208 info_->local_port.reset(); | 208 info_->local_port.reset(); |
| 209 } | 209 } |
| 210 | 210 |
| 211 void MachMultiprocess::MultiprocessChild() { | 211 void MachMultiprocess::MultiprocessChild() { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 222 ASSERT_NE(kMachPortNull, info_->remote_port); | 222 ASSERT_NE(kMachPortNull, info_->remote_port); |
| 223 | 223 |
| 224 // The “hello” message will provide the parent with its remote port, a send | 224 // The “hello” message will provide the parent with its remote port, a send |
| 225 // right to the child task’s local port receive right. It will also carry a | 225 // right to the child task’s local port receive right. It will also carry a |
| 226 // send right to the child task’s task port. | 226 // send right to the child task’s task port. |
| 227 SendHelloMessage message = {}; | 227 SendHelloMessage message = {}; |
| 228 message.header.msgh_bits = | 228 message.header.msgh_bits = |
| 229 MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND) | | 229 MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND) | |
| 230 MACH_MSGH_BITS_COMPLEX; | 230 MACH_MSGH_BITS_COMPLEX; |
| 231 message.header.msgh_size = sizeof(message); | 231 message.header.msgh_size = sizeof(message); |
| 232 message.header.msgh_remote_port = info_->remote_port; | 232 message.header.msgh_remote_port = info_->remote_port.get(); |
| 233 message.header.msgh_local_port = info_->local_port; | 233 message.header.msgh_local_port = info_->local_port.get(); |
| 234 message.body.msgh_descriptor_count = 1; | 234 message.body.msgh_descriptor_count = 1; |
| 235 message.port_descriptor.name = mach_task_self(); | 235 message.port_descriptor.name = mach_task_self(); |
| 236 message.port_descriptor.disposition = MACH_MSG_TYPE_COPY_SEND; | 236 message.port_descriptor.disposition = MACH_MSG_TYPE_COPY_SEND; |
| 237 message.port_descriptor.type = MACH_MSG_PORT_DESCRIPTOR; | 237 message.port_descriptor.type = MACH_MSG_PORT_DESCRIPTOR; |
| 238 | 238 |
| 239 kern_return_t kr = mach_msg(&message.header, | 239 kern_return_t kr = mach_msg(&message.header, |
| 240 MACH_SEND_MSG, | 240 MACH_SEND_MSG, |
| 241 message.header.msgh_size, | 241 message.header.msgh_size, |
| 242 0, | 242 0, |
| 243 MACH_PORT_NULL, | 243 MACH_PORT_NULL, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 262 if (testing::Test::HasFailure()) { | 262 if (testing::Test::HasFailure()) { |
| 263 // Trigger the ScopedForbidReturn destructor. | 263 // Trigger the ScopedForbidReturn destructor. |
| 264 return; | 264 return; |
| 265 } | 265 } |
| 266 | 266 |
| 267 forbid_return.Disarm(); | 267 forbid_return.Disarm(); |
| 268 } | 268 } |
| 269 | 269 |
| 270 } // namespace test | 270 } // namespace test |
| 271 } // namespace crashpad | 271 } // namespace crashpad |
| OLD | NEW |