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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 } | 95 } |
96 } | 96 } |
97 | 97 |
98 if (expect_port != MACH_PORT_NULL) { | 98 if (expect_port != MACH_PORT_NULL) { |
99 EXPECT_TRUE(found); | 99 EXPECT_TRUE(found); |
100 } else { | 100 } else { |
101 EXPECT_FALSE(found); | 101 EXPECT_FALSE(found); |
102 } | 102 } |
103 } | 103 } |
104 | 104 |
105 class TestExceptionPorts : public UniversalMachExcServer, | 105 class TestExceptionPorts : public MachMultiprocess, |
106 public MachMultiprocess { | 106 public UniversalMachExcServer::Interface { |
107 public: | 107 public: |
108 // Where to call ExceptionPorts::SetExceptionPort() from. | 108 // Where to call ExceptionPorts::SetExceptionPort() from. |
109 enum SetType { | 109 enum SetType { |
110 // Call it from the child process on itself. | 110 // Call it from the child process on itself. |
111 kSetInProcess = 0, | 111 kSetInProcess = 0, |
112 | 112 |
113 // Call it from the parent process on the child. | 113 // Call it from the parent process on the child. |
114 kSetOutOfProcess, | 114 kSetOutOfProcess, |
115 }; | 115 }; |
116 | 116 |
117 // Which entities to set exception ports for. | 117 // Which entities to set exception ports for. |
118 enum SetOn { | 118 enum SetOn { |
119 kSetOnTaskOnly = 0, | 119 kSetOnTaskOnly = 0, |
120 kSetOnTaskAndThreads, | 120 kSetOnTaskAndThreads, |
121 }; | 121 }; |
122 | 122 |
123 // Which thread in the child process is expected to crash. | 123 // Which thread in the child process is expected to crash. |
124 enum WhoCrashes { | 124 enum WhoCrashes { |
125 kNobodyCrashes = 0, | 125 kNobodyCrashes = 0, |
126 kMainThreadCrashes, | 126 kMainThreadCrashes, |
127 kOtherThreadCrashes, | 127 kOtherThreadCrashes, |
128 }; | 128 }; |
129 | 129 |
130 TestExceptionPorts(SetType set_type, SetOn set_on, WhoCrashes who_crashes) | 130 TestExceptionPorts(SetType set_type, SetOn set_on, WhoCrashes who_crashes) |
131 : UniversalMachExcServer(), | 131 : MachMultiprocess(), |
132 MachMultiprocess(), | 132 UniversalMachExcServer::Interface(), |
133 set_type_(set_type), | 133 set_type_(set_type), |
134 set_on_(set_on), | 134 set_on_(set_on), |
135 who_crashes_(who_crashes), | 135 who_crashes_(who_crashes), |
136 handled_(false) {} | 136 handled_(false) {} |
137 | 137 |
138 SetType set_type() const { return set_type_; } | 138 SetType set_type() const { return set_type_; } |
139 SetOn set_on() const { return set_on_; } | 139 SetOn set_on() const { return set_on_; } |
140 WhoCrashes who_crashes() const { return who_crashes_; } | 140 WhoCrashes who_crashes() const { return who_crashes_; } |
141 | 141 |
142 // UniversalMachExcServer: | 142 // UniversalMachExcServer::Interface: |
143 | 143 |
144 virtual kern_return_t CatchMachException( | 144 virtual kern_return_t CatchMachException( |
145 exception_behavior_t behavior, | 145 exception_behavior_t behavior, |
146 exception_handler_t exception_port, | 146 exception_handler_t exception_port, |
147 thread_t thread, | 147 thread_t thread, |
148 task_t task, | 148 task_t task, |
149 exception_type_t exception, | 149 exception_type_t exception, |
150 const mach_exception_data_type_t* code, | 150 const mach_exception_data_type_t* code, |
151 mach_msg_type_number_t code_count, | 151 mach_msg_type_number_t code_count, |
152 thread_state_flavor_t* flavor, | 152 thread_state_flavor_t* flavor, |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 TestGetExceptionPorts( | 436 TestGetExceptionPorts( |
437 other_thread_ports, thread_handler, EXCEPTION_STATE_IDENTITY); | 437 other_thread_ports, thread_handler, EXCEPTION_STATE_IDENTITY); |
438 } | 438 } |
439 | 439 |
440 // Let the child process know that everything in the parent process is set | 440 // Let the child process know that everything in the parent process is set |
441 // up. | 441 // up. |
442 c = '\0'; | 442 c = '\0'; |
443 CheckedWriteFD(WritePipeFD(), &c, 1); | 443 CheckedWriteFD(WritePipeFD(), &c, 1); |
444 | 444 |
445 if (who_crashes_ != kNobodyCrashes) { | 445 if (who_crashes_ != kNobodyCrashes) { |
| 446 UniversalMachExcServer universal_mach_exc_server(this); |
| 447 |
446 kern_return_t kr = | 448 kern_return_t kr = |
447 MachMessageServer::Run(this, | 449 MachMessageServer::Run(&universal_mach_exc_server, |
448 local_port, | 450 local_port, |
449 MACH_MSG_OPTION_NONE, | 451 MACH_MSG_OPTION_NONE, |
450 MachMessageServer::kOneShot, | 452 MachMessageServer::kOneShot, |
451 MachMessageServer::kBlocking, | 453 MachMessageServer::kBlocking, |
452 MachMessageServer::kReceiveLargeError, | 454 MachMessageServer::kReceiveLargeError, |
453 0); | 455 0); |
454 EXPECT_EQ(KERN_SUCCESS, kr) | 456 EXPECT_EQ(KERN_SUCCESS, kr) |
455 << MachErrorMessage(kr, "MachMessageServer::Run"); | 457 << MachErrorMessage(kr, "MachMessageServer::Run"); |
456 | 458 |
457 EXPECT_TRUE(handled_); | 459 EXPECT_TRUE(handled_); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 if (geteuid() == 0) { | 573 if (geteuid() == 0) { |
572 EXPECT_TRUE(rv); | 574 EXPECT_TRUE(rv); |
573 } else { | 575 } else { |
574 EXPECT_FALSE(rv); | 576 EXPECT_FALSE(rv); |
575 } | 577 } |
576 } | 578 } |
577 | 579 |
578 } // namespace | 580 } // namespace |
579 } // namespace test | 581 } // namespace test |
580 } // namespace crashpad | 582 } // namespace crashpad |
OLD | NEW |