| 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 17 matching lines...) Expand all Loading... |
| 28 #include "util/mach/mach_message_server.h" | 28 #include "util/mach/mach_message_server.h" |
| 29 #include "util/mach/symbolic_constants_mach.h" | 29 #include "util/mach/symbolic_constants_mach.h" |
| 30 #include "util/test/mac/mach_errors.h" | 30 #include "util/test/mac/mach_errors.h" |
| 31 #include "util/test/mac/mach_multiprocess.h" | 31 #include "util/test/mac/mach_multiprocess.h" |
| 32 | 32 |
| 33 namespace crashpad { | 33 namespace crashpad { |
| 34 namespace test { | 34 namespace test { |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 class TestSimulateCrashMac final : public MachMultiprocess, | 37 class TestSimulateCrashMac final : public MachMultiprocess, |
| 38 public UniversalMachExcServer { | 38 public UniversalMachExcServer::Interface { |
| 39 public: | 39 public: |
| 40 // Defines which targets the child should set an EXC_CRASH exception handler | 40 // Defines which targets the child should set an EXC_CRASH exception handler |
| 41 // for. | 41 // for. |
| 42 enum ExceptionPortsTarget { | 42 enum ExceptionPortsTarget { |
| 43 // The child should clear its EXC_CRASH handler for both its task and thread | 43 // The child should clear its EXC_CRASH handler for both its task and thread |
| 44 // targets. SimulateCrash() will attempt to deliver the exception to the | 44 // targets. SimulateCrash() will attempt to deliver the exception to the |
| 45 // host target, which will fail if not running as root. In any case, the | 45 // host target, which will fail if not running as root. In any case, the |
| 46 // parent should not expect to receive any exception message from the child. | 46 // parent should not expect to receive any exception message from the child. |
| 47 kExceptionPortsTargetNone = 0, | 47 kExceptionPortsTargetNone = 0, |
| 48 | 48 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 61 // delivered to the thread target, but returns an error code. The child will | 61 // delivered to the thread target, but returns an error code. The child will |
| 62 // then fall back to trying the server registered for the task target, | 62 // then fall back to trying the server registered for the task target, |
| 63 // sending a second message to the parent. The server in the parent will | 63 // sending a second message to the parent. The server in the parent will |
| 64 // handle this one successfully. | 64 // handle this one successfully. |
| 65 kExceptionPortsTargetBoth, | 65 kExceptionPortsTargetBoth, |
| 66 }; | 66 }; |
| 67 | 67 |
| 68 TestSimulateCrashMac(ExceptionPortsTarget target, | 68 TestSimulateCrashMac(ExceptionPortsTarget target, |
| 69 exception_behavior_t behavior, | 69 exception_behavior_t behavior, |
| 70 thread_state_flavor_t flavor) | 70 thread_state_flavor_t flavor) |
| 71 : target_(target), | 71 : MachMultiprocess(), |
| 72 UniversalMachExcServer::Interface(), |
| 73 target_(target), |
| 72 behavior_(behavior), | 74 behavior_(behavior), |
| 73 flavor_(flavor), | 75 flavor_(flavor), |
| 74 succeed_(true) { | 76 succeed_(true) { |
| 75 } | 77 } |
| 76 | 78 |
| 77 ~TestSimulateCrashMac() {} | 79 ~TestSimulateCrashMac() {} |
| 78 | 80 |
| 79 // UniversalMachExcServer: | 81 // UniversalMachExcServer::Interface: |
| 80 kern_return_t CatchMachException(exception_behavior_t behavior, | 82 kern_return_t CatchMachException(exception_behavior_t behavior, |
| 81 exception_handler_t exception_port, | 83 exception_handler_t exception_port, |
| 82 thread_t thread, | 84 thread_t thread, |
| 83 task_t task, | 85 task_t task, |
| 84 exception_type_t exception, | 86 exception_type_t exception, |
| 85 const mach_exception_data_type_t* code, | 87 const mach_exception_data_type_t* code, |
| 86 mach_msg_type_number_t code_count, | 88 mach_msg_type_number_t code_count, |
| 87 thread_state_flavor_t* flavor, | 89 thread_state_flavor_t* flavor, |
| 88 const natural_t* old_state, | 90 const natural_t* old_state, |
| 89 mach_msg_type_number_t old_state_count, | 91 mach_msg_type_number_t old_state_count, |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 // MachMultiprocess: | 231 // MachMultiprocess: |
| 230 | 232 |
| 231 void MachMultiprocessParent() override { | 233 void MachMultiprocessParent() override { |
| 232 if (target_ == kExceptionPortsTargetNone) { | 234 if (target_ == kExceptionPortsTargetNone) { |
| 233 // The child does not have any EXC_CRASH handlers registered for its | 235 // The child does not have any EXC_CRASH handlers registered for its |
| 234 // thread or task targets, so no exception message is expected to be | 236 // thread or task targets, so no exception message is expected to be |
| 235 // generated. Don’t run the server at all. | 237 // generated. Don’t run the server at all. |
| 236 return; | 238 return; |
| 237 } | 239 } |
| 238 | 240 |
| 241 UniversalMachExcServer universal_mach_exc_server(this); |
| 242 |
| 239 mach_msg_return_t mr; | 243 mach_msg_return_t mr; |
| 240 if (target_ == kExceptionPortsTargetBoth) { | 244 if (target_ == kExceptionPortsTargetBoth) { |
| 241 // The client has registered EXC_CRASH handlers for both its thread and | 245 // The client has registered EXC_CRASH handlers for both its thread and |
| 242 // task targets. Run a server that will return a failure code when the | 246 // task targets. Run a server that will return a failure code when the |
| 243 // exception message is sent to the thread target, which will cause the | 247 // exception message is sent to the thread target, which will cause the |
| 244 // client to fall back to the task target and send another message. | 248 // client to fall back to the task target and send another message. |
| 245 succeed_ = false; | 249 succeed_ = false; |
| 246 mr = MachMessageServer::Run(this, | 250 mr = MachMessageServer::Run(&universal_mach_exc_server, |
| 247 LocalPort(), | 251 LocalPort(), |
| 248 MACH_MSG_OPTION_NONE, | 252 MACH_MSG_OPTION_NONE, |
| 249 MachMessageServer::kOneShot, | 253 MachMessageServer::kOneShot, |
| 250 MachMessageServer::kBlocking, | 254 MachMessageServer::kBlocking, |
| 251 MachMessageServer::kReceiveLargeError, | 255 MachMessageServer::kReceiveLargeError, |
| 252 MACH_MSG_TIMEOUT_NONE); | 256 MACH_MSG_TIMEOUT_NONE); |
| 253 EXPECT_EQ(MACH_MSG_SUCCESS, mr) | 257 EXPECT_EQ(MACH_MSG_SUCCESS, mr) |
| 254 << MachErrorMessage(mr, "MachMessageServer::Run"); | 258 << MachErrorMessage(mr, "MachMessageServer::Run"); |
| 255 } | 259 } |
| 256 | 260 |
| 257 succeed_ = true; | 261 succeed_ = true; |
| 258 mr = MachMessageServer::Run(this, | 262 mr = MachMessageServer::Run(&universal_mach_exc_server, |
| 259 LocalPort(), | 263 LocalPort(), |
| 260 MACH_MSG_OPTION_NONE, | 264 MACH_MSG_OPTION_NONE, |
| 261 MachMessageServer::kOneShot, | 265 MachMessageServer::kOneShot, |
| 262 MachMessageServer::kBlocking, | 266 MachMessageServer::kBlocking, |
| 263 MachMessageServer::kReceiveLargeError, | 267 MachMessageServer::kReceiveLargeError, |
| 264 MACH_MSG_TIMEOUT_NONE); | 268 MACH_MSG_TIMEOUT_NONE); |
| 265 EXPECT_EQ(MACH_MSG_SUCCESS, mr) | 269 EXPECT_EQ(MACH_MSG_SUCCESS, mr) |
| 266 << MachErrorMessage(mr, "MachMessageServer::Run"); | 270 << MachErrorMessage(mr, "MachMessageServer::Run"); |
| 267 } | 271 } |
| 268 | 272 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 test_simulate_crash_mac.Run(); | 375 test_simulate_crash_mac.Run(); |
| 372 } | 376 } |
| 373 } | 377 } |
| 374 } | 378 } |
| 375 } | 379 } |
| 376 } | 380 } |
| 377 | 381 |
| 378 } // namespace | 382 } // namespace |
| 379 } // namespace test | 383 } // namespace test |
| 380 } // namespace crashpad | 384 } // namespace crashpad |
| OLD | NEW |