| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "sandbox/mac/bootstrap_sandbox.h" | 5 #include "sandbox/mac/bootstrap_sandbox.h" |
| 6 | 6 |
| 7 #include <CoreFoundation/CoreFoundation.h> | 7 #include <CoreFoundation/CoreFoundation.h> |
| 8 #import <Foundation/Foundation.h> | 8 #import <Foundation/Foundation.h> |
| 9 #include <mach/mach.h> | 9 #include <mach/mach.h> |
| 10 #include <servers/bootstrap.h> | 10 #include <servers/bootstrap.h> |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 char buf[32]; | 218 char buf[32]; |
| 219 }; | 219 }; |
| 220 | 220 |
| 221 struct SubstitutePortAckRecv : public SubstitutePortAckSend { | 221 struct SubstitutePortAckRecv : public SubstitutePortAckSend { |
| 222 mach_msg_trailer_t trailer; | 222 mach_msg_trailer_t trailer; |
| 223 }; | 223 }; |
| 224 | 224 |
| 225 const char kSubstituteAck[] = "Hello, this is doge!"; | 225 const char kSubstituteAck[] = "Hello, this is doge!"; |
| 226 | 226 |
| 227 TEST_F(BootstrapSandboxTest, PolicySubstitutePort) { | 227 TEST_F(BootstrapSandboxTest, PolicySubstitutePort) { |
| 228 mach_port_t task = mach_task_self(); |
| 229 |
| 228 mach_port_t port; | 230 mach_port_t port; |
| 229 ASSERT_EQ(KERN_SUCCESS, mach_port_allocate(mach_task_self(), | 231 ASSERT_EQ(KERN_SUCCESS, mach_port_allocate(task, MACH_PORT_RIGHT_RECEIVE, |
| 230 MACH_PORT_RIGHT_RECEIVE, &port)); | 232 &port)); |
| 231 base::mac::ScopedMachReceiveRight scoped_port(port); | 233 base::mac::ScopedMachReceiveRight scoped_port(port); |
| 232 | 234 |
| 235 mach_port_urefs_t send_rights = 0; |
| 236 ASSERT_EQ(KERN_SUCCESS, mach_port_get_refs(task, port, MACH_PORT_RIGHT_SEND, |
| 237 &send_rights)); |
| 238 EXPECT_EQ(0u, send_rights); |
| 239 |
| 240 ASSERT_EQ(KERN_SUCCESS, mach_port_insert_right(task, port, port, |
| 241 MACH_MSG_TYPE_MAKE_SEND)); |
| 242 base::mac::ScopedMachSendRight scoped_port_send(port); |
| 243 |
| 244 send_rights = 0; |
| 245 ASSERT_EQ(KERN_SUCCESS, mach_port_get_refs(task, port, MACH_PORT_RIGHT_SEND, |
| 246 &send_rights)); |
| 247 EXPECT_EQ(1u, send_rights); |
| 248 |
| 233 BootstrapSandboxPolicy policy(BaselinePolicy()); | 249 BootstrapSandboxPolicy policy(BaselinePolicy()); |
| 234 policy[kTestServer] = Rule(port); | 250 policy[kTestServer] = Rule(port); |
| 235 sandbox_->RegisterSandboxPolicy(1, policy); | 251 sandbox_->RegisterSandboxPolicy(1, policy); |
| 236 | 252 |
| 237 RunChildWithPolicy(1, "PolicySubstitutePort", NULL); | 253 RunChildWithPolicy(1, "PolicySubstitutePort", NULL); |
| 238 | 254 |
| 239 struct SubstitutePortAckRecv msg; | 255 struct SubstitutePortAckRecv msg; |
| 240 bzero(&msg, sizeof(msg)); | 256 bzero(&msg, sizeof(msg)); |
| 241 msg.header.msgh_size = sizeof(msg); | 257 msg.header.msgh_size = sizeof(msg); |
| 242 msg.header.msgh_local_port = port; | 258 msg.header.msgh_local_port = port; |
| 243 kern_return_t kr = mach_msg(&msg.header, MACH_RCV_MSG, 0, | 259 kern_return_t kr = mach_msg(&msg.header, MACH_RCV_MSG, 0, |
| 244 msg.header.msgh_size, port, | 260 msg.header.msgh_size, port, |
| 245 TestTimeouts::tiny_timeout().InMilliseconds(), MACH_PORT_NULL); | 261 TestTimeouts::tiny_timeout().InMilliseconds(), MACH_PORT_NULL); |
| 246 EXPECT_EQ(KERN_SUCCESS, kr); | 262 EXPECT_EQ(KERN_SUCCESS, kr); |
| 247 | 263 |
| 264 send_rights = 0; |
| 265 ASSERT_EQ(KERN_SUCCESS, mach_port_get_refs(task, port, MACH_PORT_RIGHT_SEND, |
| 266 &send_rights)); |
| 267 EXPECT_EQ(1u, send_rights); |
| 268 |
| 248 EXPECT_EQ(0, strncmp(kSubstituteAck, msg.buf, sizeof(msg.buf))); | 269 EXPECT_EQ(0, strncmp(kSubstituteAck, msg.buf, sizeof(msg.buf))); |
| 249 } | 270 } |
| 250 | 271 |
| 251 MULTIPROCESS_TEST_MAIN(PolicySubstitutePort) { | 272 MULTIPROCESS_TEST_MAIN(PolicySubstitutePort) { |
| 252 mach_port_t port = MACH_PORT_NULL; | 273 mach_port_t port = MACH_PORT_NULL; |
| 253 kern_return_t kr = bootstrap_look_up(bootstrap_port, kTestServer, &port); | 274 kern_return_t kr = bootstrap_look_up(bootstrap_port, kTestServer, &port); |
| 254 CHECK_EQ(KERN_SUCCESS, kr); | 275 CHECK_EQ(KERN_SUCCESS, kr); |
| 255 CHECK(port != MACH_PORT_NULL); | 276 CHECK(port != MACH_PORT_NULL); |
| 256 | 277 |
| 257 struct SubstitutePortAckSend msg; | 278 struct SubstitutePortAckSend msg; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 EXPECT_EQ(KERN_SUCCESS, bootstrap_look_up(bp, service_name, &service_port)); | 329 EXPECT_EQ(KERN_SUCCESS, bootstrap_look_up(bp, service_name, &service_port)); |
| 309 base::mac::ScopedMachSendRight scoped_service_port(service_port); | 330 base::mac::ScopedMachSendRight scoped_service_port(service_port); |
| 310 | 331 |
| 311 send_rights = 0; | 332 send_rights = 0; |
| 312 ASSERT_EQ(KERN_SUCCESS, mach_port_get_refs(task, port, MACH_PORT_RIGHT_SEND, | 333 ASSERT_EQ(KERN_SUCCESS, mach_port_get_refs(task, port, MACH_PORT_RIGHT_SEND, |
| 313 &send_rights)); | 334 &send_rights)); |
| 314 EXPECT_EQ(2u, send_rights); | 335 EXPECT_EQ(2u, send_rights); |
| 315 } | 336 } |
| 316 | 337 |
| 317 } // namespace sandbox | 338 } // namespace sandbox |
| OLD | NEW |