| 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, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. | 13 // limitations under the License. |
| 14 | 14 |
| 15 #ifndef CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ | 15 #ifndef CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ |
| 16 #define CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ | 16 #define CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ |
| 17 | 17 |
| 18 #include <mach/mach.h> | 18 #include <mach/mach.h> |
| 19 | 19 |
| 20 #include <set> | 20 #include <set> |
| 21 | 21 |
| 22 #include "build/build_config.h" | 22 #include "base/basictypes.h" |
| 23 #include "base/memory/scoped_ptr.h" |
| 23 #include "util/mach/mach_message_server.h" | 24 #include "util/mach/mach_message_server.h" |
| 24 | 25 |
| 25 namespace crashpad { | 26 namespace crashpad { |
| 26 | 27 |
| 27 // Routines to provide a single unified front-end to the interfaces in | |
| 28 // <mach/exc.defs> and <mach/mach_exc.defs>. The two interfaces are identical, | |
| 29 // except that the latter allows for 64-bit exception codes, and is requested by | |
| 30 // setting the MACH_EXCEPTION_CODES behavior bit associated with an exception | |
| 31 // port. | |
| 32 | |
| 33 namespace internal { | 28 namespace internal { |
| 34 | 29 class UniversalMachExcServerImpl; |
| 35 //! \brief A server interface for the `exc` Mach subsystem. | |
| 36 class ExcServer : public MachMessageServer::Interface { | |
| 37 public: | |
| 38 //! \brief An interface that the different request messages that are a part of | |
| 39 //! the `exc` Mach subsystem can be dispatched to. | |
| 40 class Interface { | |
| 41 public: | |
| 42 //! \brief Handles exceptions raised by `exception_raise()`. | |
| 43 //! | |
| 44 //! This behaves equivalently to a `catch_exception_raise()` function used | |
| 45 //! with `exc_server()`. | |
| 46 //! | |
| 47 //! \param[in] trailer The trailer received with the request message. | |
| 48 //! \param[out] destroy_request `true` if the request message is to be | |
| 49 //! destroyed even when this method returns success. See | |
| 50 //! MachMessageServer::Interface. | |
| 51 virtual kern_return_t CatchExceptionRaise( | |
| 52 exception_handler_t exception_port, | |
| 53 thread_t thread, | |
| 54 task_t task, | |
| 55 exception_type_t exception, | |
| 56 const exception_data_type_t* code, | |
| 57 mach_msg_type_number_t code_count, | |
| 58 const mach_msg_trailer_t* trailer, | |
| 59 bool* destroy_request) = 0; | |
| 60 | |
| 61 //! \brief Handles exceptions raised by `exception_raise_state()`. | |
| 62 //! | |
| 63 //! This behaves equivalently to a `catch_exception_raise_state()` function | |
| 64 //! used with `exc_server()`. | |
| 65 //! | |
| 66 //! There is no \a destroy_request parameter because, unlike | |
| 67 //! CatchExceptionRaise() and CatchExceptionRaiseStateIdentity(), the | |
| 68 //! request message is not complex (it does not carry the \a thread or \a | |
| 69 //! task port rights) and thus there is nothing to destroy. | |
| 70 //! | |
| 71 //! \param[in] trailer The trailer received with the request message. | |
| 72 virtual kern_return_t CatchExceptionRaiseState( | |
| 73 exception_handler_t exception_port, | |
| 74 exception_type_t exception, | |
| 75 const exception_data_type_t* code, | |
| 76 mach_msg_type_number_t code_count, | |
| 77 thread_state_flavor_t* flavor, | |
| 78 const natural_t* old_state, | |
| 79 mach_msg_type_number_t old_state_count, | |
| 80 thread_state_t new_state, | |
| 81 mach_msg_type_number_t* new_state_count, | |
| 82 const mach_msg_trailer_t* trailer) = 0; | |
| 83 | |
| 84 //! \brief Handles exceptions raised by `exception_raise_state_identity()`. | |
| 85 //! | |
| 86 //! This behaves equivalently to a `catch_exception_raise_state_identity()` | |
| 87 //! function used with `exc_server()`. | |
| 88 //! | |
| 89 //! \param[in] trailer The trailer received with the request message. | |
| 90 //! \param[out] destroy_request `true` if the request message is to be | |
| 91 //! destroyed even when this method returns success. See | |
| 92 //! MachMessageServer::Interface. | |
| 93 virtual kern_return_t CatchExceptionRaiseStateIdentity( | |
| 94 exception_handler_t exception_port, | |
| 95 thread_t thread, | |
| 96 task_t task, | |
| 97 exception_type_t exception, | |
| 98 const exception_data_type_t* code, | |
| 99 mach_msg_type_number_t code_count, | |
| 100 thread_state_flavor_t* flavor, | |
| 101 const natural_t* old_state, | |
| 102 mach_msg_type_number_t old_state_count, | |
| 103 thread_state_t new_state, | |
| 104 mach_msg_type_number_t* new_state_count, | |
| 105 const mach_msg_trailer_t* trailer, | |
| 106 bool* destroy_request) = 0; | |
| 107 | |
| 108 protected: | |
| 109 ~Interface() {} | |
| 110 }; | |
| 111 | |
| 112 //! \brief Constructs an object of this class. | |
| 113 //! | |
| 114 //! \param[in] interface The interface to dispatch requests to. Weak. | |
| 115 explicit ExcServer(Interface* interface); | |
| 116 | |
| 117 // MachMessageServer::Interface: | |
| 118 | |
| 119 bool MachMessageServerFunction(const mach_msg_header_t* in_header, | |
| 120 mach_msg_header_t* out_header, | |
| 121 bool* destroy_complex_request) override; | |
| 122 | |
| 123 std::set<mach_msg_id_t> MachMessageServerRequestIDs() override; | |
| 124 | |
| 125 mach_msg_size_t MachMessageServerRequestSize() override; | |
| 126 mach_msg_size_t MachMessageServerReplySize() override; | |
| 127 | |
| 128 private: | |
| 129 Interface* interface_; // weak | |
| 130 | |
| 131 DISALLOW_COPY_AND_ASSIGN(ExcServer); | |
| 132 }; | |
| 133 | |
| 134 //! \brief A server interface for the `mach_exc` Mach subsystem. | |
| 135 class MachExcServer : public MachMessageServer::Interface { | |
| 136 public: | |
| 137 //! \brief An interface that the different request messages that are a part of | |
| 138 //! the `mach_exc` Mach subsystem can be dispatched to. | |
| 139 class Interface { | |
| 140 public: | |
| 141 //! \brief Handles exceptions raised by `mach_exception_raise()`. | |
| 142 //! | |
| 143 //! This behaves equivalently to a `catch_mach_exception_raise()` function | |
| 144 //! used with `mach_exc_server()`. | |
| 145 //! | |
| 146 //! \param[in] trailer The trailer received with the request message. | |
| 147 //! \param[out] destroy_request `true` if the request message is to be | |
| 148 //! destroyed even when this method returns success. See | |
| 149 //! MachMessageServer::Interface. | |
| 150 virtual kern_return_t CatchMachExceptionRaise( | |
| 151 exception_handler_t exception_port, | |
| 152 thread_t thread, | |
| 153 task_t task, | |
| 154 exception_type_t exception, | |
| 155 const mach_exception_data_type_t* code, | |
| 156 mach_msg_type_number_t code_count, | |
| 157 const mach_msg_trailer_t* trailer, | |
| 158 bool* destroy_request) = 0; | |
| 159 | |
| 160 //! \brief Handles exceptions raised by `mach_exception_raise_state()`. | |
| 161 //! | |
| 162 //! This behaves equivalently to a `catch_mach_exception_raise_state()` | |
| 163 //! function used with `mach_exc_server()`. | |
| 164 //! | |
| 165 //! There is no \a destroy_request parameter because, unlike | |
| 166 //! CatchMachExceptionRaise() and CatchMachExceptionRaiseStateIdentity(), | |
| 167 //! the request message is not complex (it does not carry the \a thread or | |
| 168 //! \a task port rights) and thus there is nothing to destroy. | |
| 169 //! | |
| 170 //! \param[in] trailer The trailer received with the request message. | |
| 171 virtual kern_return_t CatchMachExceptionRaiseState( | |
| 172 exception_handler_t exception_port, | |
| 173 exception_type_t exception, | |
| 174 const mach_exception_data_type_t* code, | |
| 175 mach_msg_type_number_t code_count, | |
| 176 thread_state_flavor_t* flavor, | |
| 177 const natural_t* old_state, | |
| 178 mach_msg_type_number_t old_state_count, | |
| 179 thread_state_t new_state, | |
| 180 mach_msg_type_number_t* new_state_count, | |
| 181 const mach_msg_trailer_t* trailer) = 0; | |
| 182 | |
| 183 //! \brief Handles exceptions raised by | |
| 184 //! `mach_exception_raise_state_identity()`. | |
| 185 //! | |
| 186 //! This behaves equivalently to a | |
| 187 //! `catch_mach_exception_raise_state_identity()` function used with | |
| 188 //! `mach_exc_server()`. | |
| 189 //! | |
| 190 //! \param[in] trailer The trailer received with the request message. | |
| 191 //! \param[out] destroy_request `true` if the request message is to be | |
| 192 //! destroyed even when this method returns success. See | |
| 193 //! MachMessageServer::Interface. | |
| 194 virtual kern_return_t CatchMachExceptionRaiseStateIdentity( | |
| 195 exception_handler_t exception_port, | |
| 196 thread_t thread, | |
| 197 task_t task, | |
| 198 exception_type_t exception, | |
| 199 const mach_exception_data_type_t* code, | |
| 200 mach_msg_type_number_t code_count, | |
| 201 thread_state_flavor_t* flavor, | |
| 202 const natural_t* old_state, | |
| 203 mach_msg_type_number_t old_state_count, | |
| 204 thread_state_t new_state, | |
| 205 mach_msg_type_number_t* new_state_count, | |
| 206 const mach_msg_trailer_t* trailer, | |
| 207 bool* destroy_request) = 0; | |
| 208 | |
| 209 protected: | |
| 210 ~Interface() {} | |
| 211 }; | |
| 212 | |
| 213 //! \brief Constructs an object of this class. | |
| 214 //! | |
| 215 //! \param[in] interface The interface to dispatch requests to. Weak. | |
| 216 explicit MachExcServer(Interface* interface); | |
| 217 | |
| 218 // MachMessageServer::Interface: | |
| 219 | |
| 220 bool MachMessageServerFunction(const mach_msg_header_t* in_header, | |
| 221 mach_msg_header_t* out_header, | |
| 222 bool* destroy_complex_request) override; | |
| 223 | |
| 224 std::set<mach_msg_id_t> MachMessageServerRequestIDs() override; | |
| 225 | |
| 226 mach_msg_size_t MachMessageServerRequestSize() override; | |
| 227 mach_msg_size_t MachMessageServerReplySize() override; | |
| 228 | |
| 229 private: | |
| 230 Interface* interface_; // weak | |
| 231 | |
| 232 DISALLOW_COPY_AND_ASSIGN(MachExcServer); | |
| 233 }; | |
| 234 | |
| 235 //! \brief A server interface for the `exc` Mach subsystem, simplified to have | |
| 236 //! only a single interface method needing implementation. | |
| 237 class SimplifiedExcServer : public ExcServer, public ExcServer::Interface { | |
| 238 public: | |
| 239 //! \brief An interface that the different request messages that are a part of | |
| 240 //! the `exc` Mach subsystem can be dispatched to. | |
| 241 class Interface { | |
| 242 public: | |
| 243 //! \brief Handles exceptions raised by `exception_raise()`, | |
| 244 //! `exception_raise_state()`, and `exception_raise_state_identity()`. | |
| 245 //! | |
| 246 //! For convenience in implementation, these different “behaviors” of | |
| 247 //! exception messages are all mapped to a single interface method. The | |
| 248 //! exception’s original “behavior” is specified in the \a behavior | |
| 249 //! parameter. Only parameters that were supplied in the request message | |
| 250 //! are populated, other parameters are set to reasonable default values. | |
| 251 //! | |
| 252 //! The meanings of most parameters are identical to that of | |
| 253 //! ExcServer::Interface::CatchExceptionRaiseStateIdentity(). | |
| 254 //! | |
| 255 //! \param[in] behavior `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`, or | |
| 256 //! `EXCEPTION_STATE_IDENTITY`, identifying which exception request | |
| 257 //! message was processed and thus which other parameters are valid. | |
| 258 virtual kern_return_t CatchException( | |
| 259 exception_behavior_t behavior, | |
| 260 exception_handler_t exception_port, | |
| 261 thread_t thread, | |
| 262 task_t task, | |
| 263 exception_type_t exception, | |
| 264 const exception_data_type_t* code, | |
| 265 mach_msg_type_number_t code_count, | |
| 266 thread_state_flavor_t* flavor, | |
| 267 const natural_t* old_state, | |
| 268 mach_msg_type_number_t old_state_count, | |
| 269 thread_state_t new_state, | |
| 270 mach_msg_type_number_t* new_state_count, | |
| 271 const mach_msg_trailer_t* trailer, | |
| 272 bool* destroy_complex_request) = 0; | |
| 273 | |
| 274 protected: | |
| 275 ~Interface() {} | |
| 276 }; | |
| 277 | |
| 278 //! \brief Constructs an object of this class. | |
| 279 //! | |
| 280 //! \param[in] interface The interface to dispatch requests to. Weak. | |
| 281 explicit SimplifiedExcServer(Interface* interface); | |
| 282 | |
| 283 // ExcServer::Interface: | |
| 284 | |
| 285 kern_return_t CatchExceptionRaise(exception_handler_t exception_port, | |
| 286 thread_t thread, | |
| 287 task_t task, | |
| 288 exception_type_t exception, | |
| 289 const exception_data_type_t* code, | |
| 290 mach_msg_type_number_t code_count, | |
| 291 const mach_msg_trailer_t* trailer, | |
| 292 bool* destroy_request) override; | |
| 293 kern_return_t CatchExceptionRaiseState( | |
| 294 exception_handler_t exception_port, | |
| 295 exception_type_t exception, | |
| 296 const exception_data_type_t* code, | |
| 297 mach_msg_type_number_t code_count, | |
| 298 thread_state_flavor_t* flavor, | |
| 299 const natural_t* old_state, | |
| 300 mach_msg_type_number_t old_state_count, | |
| 301 thread_state_t new_state, | |
| 302 mach_msg_type_number_t* new_state_count, | |
| 303 const mach_msg_trailer_t* trailer) override; | |
| 304 kern_return_t CatchExceptionRaiseStateIdentity( | |
| 305 exception_handler_t exception_port, | |
| 306 thread_t thread, | |
| 307 task_t task, | |
| 308 exception_type_t exception, | |
| 309 const exception_data_type_t* code, | |
| 310 mach_msg_type_number_t code_count, | |
| 311 thread_state_flavor_t* flavor, | |
| 312 const natural_t* old_state, | |
| 313 mach_msg_type_number_t old_state_count, | |
| 314 thread_state_t new_state, | |
| 315 mach_msg_type_number_t* new_state_count, | |
| 316 const mach_msg_trailer_t* trailer, | |
| 317 bool* destroy_request) override; | |
| 318 | |
| 319 private: | |
| 320 Interface* interface_; // weak | |
| 321 | |
| 322 DISALLOW_COPY_AND_ASSIGN(SimplifiedExcServer); | |
| 323 }; | |
| 324 | |
| 325 //! \brief A server interface for the `mach_exc` Mach subsystem, simplified to | |
| 326 //! have only a single interface method needing implementation. | |
| 327 class SimplifiedMachExcServer : public MachExcServer, | |
| 328 public MachExcServer::Interface { | |
| 329 public: | |
| 330 //! \brief An interface that the different request messages that are a part of | |
| 331 //! the `mach_exc` Mach subsystem can be dispatched to. | |
| 332 class Interface { | |
| 333 public: | |
| 334 //! \brief Handles exceptions raised by `mach_exception_raise()`, | |
| 335 //! `mach_exception_raise_state()`, and | |
| 336 //! `mach_exception_raise_state_identity()`. | |
| 337 //! | |
| 338 //! For convenience in implementation, these different “behaviors” of | |
| 339 //! exception messages are all mapped to a single interface method. The | |
| 340 //! exception’s original “behavior” is specified in the \a behavior | |
| 341 //! parameter. Only parameters that were supplied in the request message | |
| 342 //! are populated, other parameters are set to reasonable default values. | |
| 343 //! | |
| 344 //! The meanings of most parameters are identical to that of | |
| 345 //! MachExcServer::Interface::CatchMachExceptionRaiseStateIdentity(). | |
| 346 //! | |
| 347 //! \param[in] behavior `MACH_EXCEPTION_CODES | EXCEPTION_DEFAULT`, | |
| 348 //! `MACH_EXCEPTION_CODES | EXCEPTION_STATE`, or | |
| 349 //! `MACH_EXCEPTION_CODES | EXCEPTION_STATE_IDENTITY`, identifying which | |
| 350 //! exception request message was processed and thus which other | |
| 351 //! parameters are valid. | |
| 352 virtual kern_return_t CatchMachException( | |
| 353 exception_behavior_t behavior, | |
| 354 exception_handler_t exception_port, | |
| 355 thread_t thread, | |
| 356 task_t task, | |
| 357 exception_type_t exception, | |
| 358 const mach_exception_data_type_t* code, | |
| 359 mach_msg_type_number_t code_count, | |
| 360 thread_state_flavor_t* flavor, | |
| 361 const natural_t* old_state, | |
| 362 mach_msg_type_number_t old_state_count, | |
| 363 thread_state_t new_state, | |
| 364 mach_msg_type_number_t* new_state_count, | |
| 365 const mach_msg_trailer_t* trailer, | |
| 366 bool* destroy_complex_request) = 0; | |
| 367 | |
| 368 protected: | |
| 369 ~Interface() {} | |
| 370 }; | |
| 371 | |
| 372 //! \brief Constructs an object of this class. | |
| 373 //! | |
| 374 //! \param[in] interface The interface to dispatch requests to. Weak. | |
| 375 explicit SimplifiedMachExcServer(Interface* interface); | |
| 376 | |
| 377 // MachExcServer::Interface: | |
| 378 | |
| 379 kern_return_t CatchMachExceptionRaise(exception_handler_t exception_port, | |
| 380 thread_t thread, | |
| 381 task_t task, | |
| 382 exception_type_t exception, | |
| 383 const mach_exception_data_type_t* code, | |
| 384 mach_msg_type_number_t code_count, | |
| 385 const mach_msg_trailer_t* trailer, | |
| 386 bool* destroy_request) override; | |
| 387 kern_return_t CatchMachExceptionRaiseState( | |
| 388 exception_handler_t exception_port, | |
| 389 exception_type_t exception, | |
| 390 const mach_exception_data_type_t* code, | |
| 391 mach_msg_type_number_t code_count, | |
| 392 thread_state_flavor_t* flavor, | |
| 393 const natural_t* old_state, | |
| 394 mach_msg_type_number_t old_state_count, | |
| 395 thread_state_t new_state, | |
| 396 mach_msg_type_number_t* new_state_count, | |
| 397 const mach_msg_trailer_t* trailer) override; | |
| 398 kern_return_t CatchMachExceptionRaiseStateIdentity( | |
| 399 exception_handler_t exception_port, | |
| 400 thread_t thread, | |
| 401 task_t task, | |
| 402 exception_type_t exception, | |
| 403 const mach_exception_data_type_t* code, | |
| 404 mach_msg_type_number_t code_count, | |
| 405 thread_state_flavor_t* flavor, | |
| 406 const natural_t* old_state, | |
| 407 mach_msg_type_number_t old_state_count, | |
| 408 thread_state_t new_state, | |
| 409 mach_msg_type_number_t* new_state_count, | |
| 410 const mach_msg_trailer_t* trailer, | |
| 411 bool* destroy_request) override; | |
| 412 | |
| 413 private: | |
| 414 Interface* interface_; // weak | |
| 415 | |
| 416 DISALLOW_COPY_AND_ASSIGN(SimplifiedMachExcServer); | |
| 417 }; | |
| 418 | |
| 419 } // namespace internal | 30 } // namespace internal |
| 420 | 31 |
| 421 //! \brief A server interface for the `exc` and `mach_exc` Mach subsystems, | 32 //! \brief A server interface for the `exc` and `mach_exc` Mach subsystems, |
| 422 //! unified to handle exceptions delivered to either subsystem, and | 33 //! unified to handle exceptions delivered to either subsystem, and |
| 423 //! simplified to have only a single interface method needing | 34 //! simplified to have only a single interface method needing |
| 424 //! implementation. | 35 //! implementation. |
| 425 //! | 36 //! |
| 37 //! The `<mach/exc.defs>` and `<mach/mach_exc.defs>` interfaces are identical, |
| 38 //! except that the latter allows for 64-bit exception codes, and is requested |
| 39 //! by setting the MACH_EXCEPTION_CODES behavior bit associated with an |
| 40 //! exception port. |
| 41 //! |
| 426 //! UniversalMachExcServer operates by translating messages received in the | 42 //! UniversalMachExcServer operates by translating messages received in the |
| 427 //! `exc` subsystem to a variant that is compatible with the `mach_exc` | 43 //! `exc` subsystem to a variant that is compatible with the `mach_exc` |
| 428 //! subsystem. This involves changing the format of \a code, the exception code | 44 //! subsystem. This involves changing the format of \a code, the exception code |
| 429 //! field, from `exception_data_type_t` to `mach_exception_data_type_t`. | 45 //! field, from `exception_data_type_t` to `mach_exception_data_type_t`. |
| 430 //! This is achieved by implementing SimplifiedExcServer::Interface and having | 46 class UniversalMachExcServer final : public MachMessageServer::Interface { |
| 431 //! it forward translated messages to SimplifiedMachExcServer::Interface, which | |
| 432 //! is left unimplemented here so that users of this class can provide their own | |
| 433 //! implementations. | |
| 434 class UniversalMachExcServer | |
| 435 : public MachMessageServer::Interface, | |
| 436 public internal::SimplifiedExcServer::Interface, | |
| 437 public internal::SimplifiedMachExcServer::Interface { | |
| 438 public: | 47 public: |
| 439 //! \brief An interface that the different request messages that are a part of | 48 //! \brief An interface that the different request messages that are a part of |
| 440 //! the `exc` and `mach_exc` Mach subsystems can be dispatched to. | 49 //! the `exc` and `mach_exc` Mach subsystems can be dispatched to. |
| 441 class Interface { | 50 class Interface { |
| 442 public: | 51 public: |
| 443 //! \brief Handles exceptions raised by `exception_raise()`, | 52 //! \brief Handles exceptions raised by `exception_raise()`, |
| 444 //! `exception_raise_state()`, `exception_raise_state_identity()`, | 53 //! `exception_raise_state()`, `exception_raise_state_identity()`, |
| 445 //! `mach_exception_raise()`, `mach_exception_raise_state()`, and | 54 //! `mach_exception_raise()`, `mach_exception_raise_state()`, and |
| 446 //! `mach_exception_raise_state_identity()`. | 55 //! `mach_exception_raise_state_identity()`. |
| 447 //! | 56 //! |
| 448 //! For convenience in implementation, these different “behaviors” of | 57 //! For convenience in implementation, these different “behaviors” of |
| 449 //! exception messages are all mapped to a single interface method. The | 58 //! exception messages are all mapped to a single interface method. The |
| 450 //! exception’s original “behavior” is specified in the \a behavior | 59 //! exception’s original “behavior” is specified in the \a behavior |
| 451 //! parameter. Only parameters that were supplied in the request message | 60 //! parameter. Only parameters that were supplied in the request message |
| 452 //! are populated, other parameters are set to reasonable default values. | 61 //! are populated, other parameters are set to reasonable default values. |
| 453 //! | 62 //! |
| 454 //! The meanings of most parameters are identical to that of | 63 //! This behaves equivalently to a `catch_exception_raise_state_identity()` |
| 455 //! MachExcServer::Interface::CatchMachExceptionRaiseStateIdentity(). | 64 //! function used with `exc_server()`, or a |
| 65 //! `catch_mach_exception_raise_state_identity()` function used with |
| 66 //! `mach_exc_server()`. The meanings of most parameters are identical to |
| 67 //! their meanings to these functions. |
| 456 //! | 68 //! |
| 457 //! \param[in] behavior `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`, | 69 //! \param[in] behavior `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`, |
| 458 //! or `EXCEPTION_STATE_IDENTITY`, possibly with `MACH_EXCEPTION_CODES` | 70 //! or `EXCEPTION_STATE_IDENTITY`, possibly with `MACH_EXCEPTION_CODES` |
| 459 //! ORed in. This identifies which exception request message was | 71 //! ORed in. This identifies which exception request message was |
| 460 //! processed and thus which other parameters are valid. | 72 //! processed and thus which other parameters are valid. |
| 73 //! \param[in] trailer The trailer received with the request message. |
| 74 //! \param[out] destroy_request `true` if the request message is to be |
| 75 //! destroyed even when this method returns success. See |
| 76 //! MachMessageServer::Interface. |
| 461 virtual kern_return_t CatchMachException( | 77 virtual kern_return_t CatchMachException( |
| 462 exception_behavior_t behavior, | 78 exception_behavior_t behavior, |
| 463 exception_handler_t exception_port, | 79 exception_handler_t exception_port, |
| 464 thread_t thread, | 80 thread_t thread, |
| 465 task_t task, | 81 task_t task, |
| 466 exception_type_t exception, | 82 exception_type_t exception, |
| 467 const mach_exception_data_type_t* code, | 83 const mach_exception_data_type_t* code, |
| 468 mach_msg_type_number_t code_count, | 84 mach_msg_type_number_t code_count, |
| 469 thread_state_flavor_t* flavor, | 85 thread_state_flavor_t* flavor, |
| 470 const natural_t* old_state, | 86 const natural_t* old_state, |
| 471 mach_msg_type_number_t old_state_count, | 87 mach_msg_type_number_t old_state_count, |
| 472 thread_state_t new_state, | 88 thread_state_t new_state, |
| 473 mach_msg_type_number_t* new_state_count, | 89 mach_msg_type_number_t* new_state_count, |
| 474 const mach_msg_trailer_t* trailer, | 90 const mach_msg_trailer_t* trailer, |
| 475 bool* destroy_complex_request) = 0; | 91 bool* destroy_complex_request) = 0; |
| 476 | 92 |
| 477 protected: | 93 protected: |
| 478 ~Interface() {} | 94 ~Interface() {} |
| 479 }; | 95 }; |
| 480 | 96 |
| 481 //! \brief Constructs an object of this class. | 97 //! \brief Constructs an object of this class. |
| 482 //! | 98 //! |
| 483 //! \param[in] interface The interface to dispatch requests to. Weak. | 99 //! \param[in] interface The interface to dispatch requests to. Weak. |
| 484 explicit UniversalMachExcServer(Interface* interface); | 100 explicit UniversalMachExcServer(Interface* interface); |
| 485 | 101 |
| 102 ~UniversalMachExcServer(); |
| 103 |
| 486 // MachMessageServer::Interface: | 104 // MachMessageServer::Interface: |
| 487 | 105 |
| 488 bool MachMessageServerFunction(const mach_msg_header_t* in_header, | 106 bool MachMessageServerFunction(const mach_msg_header_t* in_header, |
| 489 mach_msg_header_t* out_header, | 107 mach_msg_header_t* out_header, |
| 490 bool* destroy_complex_request) override; | 108 bool* destroy_complex_request) override; |
| 491 | 109 |
| 492 std::set<mach_msg_id_t> MachMessageServerRequestIDs() override; | 110 std::set<mach_msg_id_t> MachMessageServerRequestIDs() override; |
| 493 | 111 |
| 494 mach_msg_size_t MachMessageServerRequestSize() override; | 112 mach_msg_size_t MachMessageServerRequestSize() override; |
| 495 mach_msg_size_t MachMessageServerReplySize() override; | 113 mach_msg_size_t MachMessageServerReplySize() override; |
| 496 | 114 |
| 497 // internal::SimplifiedExcServer::Interface: | |
| 498 | |
| 499 kern_return_t CatchException(exception_behavior_t behavior, | |
| 500 exception_handler_t exception_port, | |
| 501 thread_t thread, | |
| 502 task_t task, | |
| 503 exception_type_t exception, | |
| 504 const exception_data_type_t* code, | |
| 505 mach_msg_type_number_t code_count, | |
| 506 thread_state_flavor_t* flavor, | |
| 507 const natural_t* old_state, | |
| 508 mach_msg_type_number_t old_state_count, | |
| 509 thread_state_t new_state, | |
| 510 mach_msg_type_number_t* new_state_count, | |
| 511 const mach_msg_trailer_t* trailer, | |
| 512 bool* destroy_complex_request) override; | |
| 513 | |
| 514 // internal::SimplifiedMachExcServer::Interface: | |
| 515 | |
| 516 kern_return_t CatchMachException(exception_behavior_t behavior, | |
| 517 exception_handler_t exception_port, | |
| 518 thread_t thread, | |
| 519 task_t task, | |
| 520 exception_type_t exception, | |
| 521 const mach_exception_data_type_t* code, | |
| 522 mach_msg_type_number_t code_count, | |
| 523 thread_state_flavor_t* flavor, | |
| 524 const natural_t* old_state, | |
| 525 mach_msg_type_number_t old_state_count, | |
| 526 thread_state_t new_state, | |
| 527 mach_msg_type_number_t* new_state_count, | |
| 528 const mach_msg_trailer_t* trailer, | |
| 529 bool* destroy_complex_request) override; | |
| 530 | |
| 531 private: | 115 private: |
| 532 internal::SimplifiedExcServer exc_server_; | 116 scoped_ptr<internal::UniversalMachExcServerImpl> impl_; |
| 533 internal::SimplifiedMachExcServer mach_exc_server_; | |
| 534 Interface* interface_; // weak | |
| 535 | 117 |
| 536 DISALLOW_COPY_AND_ASSIGN(UniversalMachExcServer); | 118 DISALLOW_COPY_AND_ASSIGN(UniversalMachExcServer); |
| 537 }; | 119 }; |
| 538 | 120 |
| 539 //! \brief Recovers the original exception, first exception code, and signal | 121 //! \brief Recovers the original exception, first exception code, and signal |
| 540 //! from the encoded form of the first exception code delivered with | 122 //! from the encoded form of the first exception code delivered with |
| 541 //! `EXC_CRASH` exceptions. | 123 //! `EXC_CRASH` exceptions. |
| 542 //! | 124 //! |
| 543 //! `EXC_CRASH` exceptions are generated when the kernel has committed to | 125 //! `EXC_CRASH` exceptions are generated when the kernel has committed to |
| 544 //! terminating a process as a result of a core-generating POSIX signal and, for | 126 //! terminating a process as a result of a core-generating POSIX signal and, for |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 //! \a behavior is not a state-carrying behavior, or when it is a | 198 //! \a behavior is not a state-carrying behavior, or when it is a |
| 617 //! state-carrying behavior and \a set_thread_state is `true`. | 199 //! state-carrying behavior and \a set_thread_state is `true`. |
| 618 //! `MACH_RCV_PORT_DIED` is used when \a behavior is a state-carrying | 200 //! `MACH_RCV_PORT_DIED` is used when \a behavior is a state-carrying |
| 619 //! behavior and \a set_thread_state is `false`. | 201 //! behavior and \a set_thread_state is `false`. |
| 620 kern_return_t ExcServerSuccessfulReturnValue(exception_behavior_t behavior, | 202 kern_return_t ExcServerSuccessfulReturnValue(exception_behavior_t behavior, |
| 621 bool set_thread_state); | 203 bool set_thread_state); |
| 622 | 204 |
| 623 } // namespace crashpad | 205 } // namespace crashpad |
| 624 | 206 |
| 625 #endif // CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ | 207 #endif // CRASHPAD_UTIL_MACH_EXC_SERVER_VARIANTS_H_ |
| OLD | NEW |