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 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 mach_msg_type_number_t code_count, | 483 mach_msg_type_number_t code_count, |
484 const mach_msg_trailer_t* trailer, | 484 const mach_msg_trailer_t* trailer, |
485 bool* destroy_request) { | 485 bool* destroy_request) { |
486 thread_state_flavor_t flavor = THREAD_STATE_NONE; | 486 thread_state_flavor_t flavor = THREAD_STATE_NONE; |
487 mach_msg_type_number_t new_state_count = 0; | 487 mach_msg_type_number_t new_state_count = 0; |
488 return interface_->CatchException(EXCEPTION_DEFAULT, | 488 return interface_->CatchException(EXCEPTION_DEFAULT, |
489 exception_port, | 489 exception_port, |
490 thread, | 490 thread, |
491 task, | 491 task, |
492 exception, | 492 exception, |
493 code, | 493 code_count ? code : nullptr, |
494 code_count, | 494 code_count, |
495 &flavor, | 495 &flavor, |
496 nullptr, | 496 nullptr, |
497 0, | 497 0, |
498 nullptr, | 498 nullptr, |
499 &new_state_count, | 499 &new_state_count, |
500 trailer, | 500 trailer, |
501 destroy_request); | 501 destroy_request); |
502 } | 502 } |
503 | 503 |
504 kern_return_t SimplifiedExcServer::CatchExceptionRaiseState( | 504 kern_return_t SimplifiedExcServer::CatchExceptionRaiseState( |
505 exception_handler_t exception_port, | 505 exception_handler_t exception_port, |
506 exception_type_t exception, | 506 exception_type_t exception, |
507 const exception_data_type_t* code, | 507 const exception_data_type_t* code, |
508 mach_msg_type_number_t code_count, | 508 mach_msg_type_number_t code_count, |
509 thread_state_flavor_t* flavor, | 509 thread_state_flavor_t* flavor, |
510 const natural_t* old_state, | 510 const natural_t* old_state, |
511 mach_msg_type_number_t old_state_count, | 511 mach_msg_type_number_t old_state_count, |
512 thread_state_t new_state, | 512 thread_state_t new_state, |
513 mach_msg_type_number_t* new_state_count, | 513 mach_msg_type_number_t* new_state_count, |
514 const mach_msg_trailer_t* trailer) { | 514 const mach_msg_trailer_t* trailer) { |
515 bool destroy_complex_request = false; | 515 bool destroy_complex_request = false; |
516 return interface_->CatchException(EXCEPTION_STATE, | 516 return interface_->CatchException(EXCEPTION_STATE, |
517 exception_port, | 517 exception_port, |
518 THREAD_NULL, | 518 THREAD_NULL, |
519 TASK_NULL, | 519 TASK_NULL, |
520 exception, | 520 exception, |
521 code, | 521 code_count ? code : nullptr, |
522 code_count, | 522 code_count, |
523 flavor, | 523 flavor, |
524 old_state, | 524 old_state_count ? old_state : nullptr, |
525 old_state_count, | 525 old_state_count, |
526 new_state, | 526 new_state_count ? new_state : nullptr, |
527 new_state_count, | 527 new_state_count, |
528 trailer, | 528 trailer, |
529 &destroy_complex_request); | 529 &destroy_complex_request); |
530 } | 530 } |
531 | 531 |
532 kern_return_t SimplifiedExcServer::CatchExceptionRaiseStateIdentity( | 532 kern_return_t SimplifiedExcServer::CatchExceptionRaiseStateIdentity( |
533 exception_handler_t exception_port, | 533 exception_handler_t exception_port, |
534 thread_t thread, | 534 thread_t thread, |
535 task_t task, | 535 task_t task, |
536 exception_type_t exception, | 536 exception_type_t exception, |
537 const exception_data_type_t* code, | 537 const exception_data_type_t* code, |
538 mach_msg_type_number_t code_count, | 538 mach_msg_type_number_t code_count, |
539 thread_state_flavor_t* flavor, | 539 thread_state_flavor_t* flavor, |
540 const natural_t* old_state, | 540 const natural_t* old_state, |
541 mach_msg_type_number_t old_state_count, | 541 mach_msg_type_number_t old_state_count, |
542 thread_state_t new_state, | 542 thread_state_t new_state, |
543 mach_msg_type_number_t* new_state_count, | 543 mach_msg_type_number_t* new_state_count, |
544 const mach_msg_trailer_t* trailer, | 544 const mach_msg_trailer_t* trailer, |
545 bool* destroy_request) { | 545 bool* destroy_request) { |
546 return interface_->CatchException(EXCEPTION_STATE_IDENTITY, | 546 return interface_->CatchException(EXCEPTION_STATE_IDENTITY, |
547 exception_port, | 547 exception_port, |
548 thread, | 548 thread, |
549 task, | 549 task, |
550 exception, | 550 exception, |
551 code, | 551 code_count ? code : nullptr, |
552 code_count, | 552 code_count, |
553 flavor, | 553 flavor, |
554 old_state, | 554 old_state_count ? old_state : nullptr, |
555 old_state_count, | 555 old_state_count, |
556 new_state, | 556 new_state_count ? new_state : nullptr, |
557 new_state_count, | 557 new_state_count, |
558 trailer, | 558 trailer, |
559 destroy_request); | 559 destroy_request); |
560 } | 560 } |
561 | 561 |
562 SimplifiedMachExcServer::SimplifiedMachExcServer( | 562 SimplifiedMachExcServer::SimplifiedMachExcServer( |
563 SimplifiedMachExcServer::Interface* interface) | 563 SimplifiedMachExcServer::Interface* interface) |
564 : MachExcServer(this), | 564 : MachExcServer(this), |
565 MachExcServer::Interface(), | 565 MachExcServer::Interface(), |
566 interface_(interface) { | 566 interface_(interface) { |
567 } | 567 } |
568 | 568 |
569 kern_return_t SimplifiedMachExcServer::CatchMachExceptionRaise( | 569 kern_return_t SimplifiedMachExcServer::CatchMachExceptionRaise( |
570 exception_handler_t exception_port, | 570 exception_handler_t exception_port, |
571 thread_t thread, | 571 thread_t thread, |
572 task_t task, | 572 task_t task, |
573 exception_type_t exception, | 573 exception_type_t exception, |
574 const mach_exception_data_type_t* code, | 574 const mach_exception_data_type_t* code, |
575 mach_msg_type_number_t code_count, | 575 mach_msg_type_number_t code_count, |
576 const mach_msg_trailer_t* trailer, | 576 const mach_msg_trailer_t* trailer, |
577 bool* destroy_request) { | 577 bool* destroy_request) { |
578 thread_state_flavor_t flavor = THREAD_STATE_NONE; | 578 thread_state_flavor_t flavor = THREAD_STATE_NONE; |
579 mach_msg_type_number_t new_state_count = 0; | 579 mach_msg_type_number_t new_state_count = 0; |
580 return interface_->CatchMachException( | 580 return interface_->CatchMachException( |
581 EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES, | 581 EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES, |
582 exception_port, | 582 exception_port, |
583 thread, | 583 thread, |
584 task, | 584 task, |
585 exception, | 585 exception, |
586 code, | 586 code_count ? code : nullptr, |
587 code_count, | 587 code_count, |
588 &flavor, | 588 &flavor, |
589 nullptr, | 589 nullptr, |
590 0, | 590 0, |
591 nullptr, | 591 nullptr, |
592 &new_state_count, | 592 &new_state_count, |
593 trailer, | 593 trailer, |
594 destroy_request); | 594 destroy_request); |
595 } | 595 } |
596 | 596 |
597 kern_return_t SimplifiedMachExcServer::CatchMachExceptionRaiseState( | 597 kern_return_t SimplifiedMachExcServer::CatchMachExceptionRaiseState( |
598 exception_handler_t exception_port, | 598 exception_handler_t exception_port, |
599 exception_type_t exception, | 599 exception_type_t exception, |
600 const mach_exception_data_type_t* code, | 600 const mach_exception_data_type_t* code, |
601 mach_msg_type_number_t code_count, | 601 mach_msg_type_number_t code_count, |
602 thread_state_flavor_t* flavor, | 602 thread_state_flavor_t* flavor, |
603 const natural_t* old_state, | 603 const natural_t* old_state, |
604 mach_msg_type_number_t old_state_count, | 604 mach_msg_type_number_t old_state_count, |
605 thread_state_t new_state, | 605 thread_state_t new_state, |
606 mach_msg_type_number_t* new_state_count, | 606 mach_msg_type_number_t* new_state_count, |
607 const mach_msg_trailer_t* trailer) { | 607 const mach_msg_trailer_t* trailer) { |
608 bool destroy_complex_request = false; | 608 bool destroy_complex_request = false; |
609 return interface_->CatchMachException(EXCEPTION_STATE | MACH_EXCEPTION_CODES, | 609 return interface_->CatchMachException(EXCEPTION_STATE | MACH_EXCEPTION_CODES, |
610 exception_port, | 610 exception_port, |
611 THREAD_NULL, | 611 THREAD_NULL, |
612 TASK_NULL, | 612 TASK_NULL, |
613 exception, | 613 exception, |
614 code, | 614 code_count ? code : nullptr, |
615 code_count, | 615 code_count, |
616 flavor, | 616 flavor, |
617 old_state, | 617 old_state_count ? old_state : nullptr, |
618 old_state_count, | 618 old_state_count, |
619 new_state, | 619 new_state_count ? new_state : nullptr, |
620 new_state_count, | 620 new_state_count, |
621 trailer, | 621 trailer, |
622 &destroy_complex_request); | 622 &destroy_complex_request); |
623 } | 623 } |
624 | 624 |
625 kern_return_t SimplifiedMachExcServer::CatchMachExceptionRaiseStateIdentity( | 625 kern_return_t SimplifiedMachExcServer::CatchMachExceptionRaiseStateIdentity( |
626 exception_handler_t exception_port, | 626 exception_handler_t exception_port, |
627 thread_t thread, | 627 thread_t thread, |
628 task_t task, | 628 task_t task, |
629 exception_type_t exception, | 629 exception_type_t exception, |
630 const mach_exception_data_type_t* code, | 630 const mach_exception_data_type_t* code, |
631 mach_msg_type_number_t code_count, | 631 mach_msg_type_number_t code_count, |
632 thread_state_flavor_t* flavor, | 632 thread_state_flavor_t* flavor, |
633 const natural_t* old_state, | 633 const natural_t* old_state, |
634 mach_msg_type_number_t old_state_count, | 634 mach_msg_type_number_t old_state_count, |
635 thread_state_t new_state, | 635 thread_state_t new_state, |
636 mach_msg_type_number_t* new_state_count, | 636 mach_msg_type_number_t* new_state_count, |
637 const mach_msg_trailer_t* trailer, | 637 const mach_msg_trailer_t* trailer, |
638 bool* destroy_request) { | 638 bool* destroy_request) { |
639 return interface_->CatchMachException( | 639 return interface_->CatchMachException( |
640 EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, | 640 EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, |
641 exception_port, | 641 exception_port, |
642 thread, | 642 thread, |
643 task, | 643 task, |
644 exception, | 644 exception, |
645 code, | 645 code_count ? code : nullptr, |
646 code_count, | 646 code_count, |
647 flavor, | 647 flavor, |
648 old_state, | 648 old_state_count ? old_state : nullptr, |
649 old_state_count, | 649 old_state_count, |
650 new_state, | 650 new_state_count ? new_state : nullptr, |
651 new_state_count, | 651 new_state_count, |
652 trailer, | 652 trailer, |
653 destroy_request); | 653 destroy_request); |
654 } | 654 } |
655 | 655 |
656 } // namespace internal | 656 } // namespace internal |
657 | 657 |
658 UniversalMachExcServer::UniversalMachExcServer() | 658 UniversalMachExcServer::UniversalMachExcServer( |
| 659 UniversalMachExcServer::Interface* interface) |
659 : MachMessageServer::Interface(), | 660 : MachMessageServer::Interface(), |
660 internal::SimplifiedExcServer::Interface(), | 661 internal::SimplifiedExcServer::Interface(), |
661 internal::SimplifiedMachExcServer::Interface(), | 662 internal::SimplifiedMachExcServer::Interface(), |
662 exc_server_(this), | 663 exc_server_(this), |
663 mach_exc_server_(this) { | 664 mach_exc_server_(this), |
| 665 interface_(interface) { |
664 } | 666 } |
665 | 667 |
666 bool UniversalMachExcServer::MachMessageServerFunction( | 668 bool UniversalMachExcServer::MachMessageServerFunction( |
667 const mach_msg_header_t* in_header, | 669 const mach_msg_header_t* in_header, |
668 mach_msg_header_t* out_header, | 670 mach_msg_header_t* out_header, |
669 bool* destroy_complex_request) { | 671 bool* destroy_complex_request) { |
670 switch (in_header->msgh_id) { | 672 switch (in_header->msgh_id) { |
671 case kMachMessageIDMachExceptionRaise: | 673 case kMachMessageIDMachExceptionRaise: |
672 case kMachMessageIDMachExceptionRaiseState: | 674 case kMachMessageIDMachExceptionRaiseState: |
673 case kMachMessageIDMachExceptionRaiseStateIdentity: | 675 case kMachMessageIDMachExceptionRaiseStateIdentity: |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 thread_state_t new_state, | 713 thread_state_t new_state, |
712 mach_msg_type_number_t* new_state_count, | 714 mach_msg_type_number_t* new_state_count, |
713 const mach_msg_trailer_t* trailer, | 715 const mach_msg_trailer_t* trailer, |
714 bool* destroy_complex_request) { | 716 bool* destroy_complex_request) { |
715 std::vector<mach_exception_data_type_t> mach_codes; | 717 std::vector<mach_exception_data_type_t> mach_codes; |
716 mach_codes.reserve(code_count); | 718 mach_codes.reserve(code_count); |
717 for (size_t index = 0; index < code_count; ++index) { | 719 for (size_t index = 0; index < code_count; ++index) { |
718 mach_codes.push_back(code[index]); | 720 mach_codes.push_back(code[index]); |
719 } | 721 } |
720 | 722 |
721 return CatchMachException(behavior, | 723 return interface_->CatchMachException(behavior, |
722 exception_port, | 724 exception_port, |
723 thread, | 725 thread, |
724 task, | 726 task, |
725 exception, | 727 exception, |
726 code_count ? &mach_codes[0] : nullptr, | 728 code_count ? &mach_codes[0] : nullptr, |
727 code_count, | 729 code_count, |
728 flavor, | 730 flavor, |
729 old_state, | 731 old_state_count ? old_state : nullptr, |
730 old_state_count, | 732 old_state_count, |
731 new_state, | 733 new_state_count ? new_state : nullptr, |
732 new_state_count, | 734 new_state_count, |
733 trailer, | 735 trailer, |
734 destroy_complex_request); | 736 destroy_complex_request); |
| 737 } |
| 738 |
| 739 kern_return_t UniversalMachExcServer::CatchMachException( |
| 740 exception_behavior_t behavior, |
| 741 exception_handler_t exception_port, |
| 742 thread_t thread, |
| 743 task_t task, |
| 744 exception_type_t exception, |
| 745 const mach_exception_data_type_t* code, |
| 746 mach_msg_type_number_t code_count, |
| 747 thread_state_flavor_t* flavor, |
| 748 const natural_t* old_state, |
| 749 mach_msg_type_number_t old_state_count, |
| 750 thread_state_t new_state, |
| 751 mach_msg_type_number_t* new_state_count, |
| 752 const mach_msg_trailer_t* trailer, |
| 753 bool* destroy_complex_request) { |
| 754 return interface_->CatchMachException(behavior, |
| 755 exception_port, |
| 756 thread, |
| 757 task, |
| 758 exception, |
| 759 code_count ? code : nullptr, |
| 760 code_count, |
| 761 flavor, |
| 762 old_state_count ? old_state : nullptr, |
| 763 old_state_count, |
| 764 new_state_count ? new_state : nullptr, |
| 765 new_state_count, |
| 766 trailer, |
| 767 destroy_complex_request); |
735 } | 768 } |
736 | 769 |
737 exception_type_t ExcCrashRecoverOriginalException( | 770 exception_type_t ExcCrashRecoverOriginalException( |
738 mach_exception_code_t code_0, | 771 mach_exception_code_t code_0, |
739 mach_exception_code_t* original_code_0, | 772 mach_exception_code_t* original_code_0, |
740 int* signal) { | 773 int* signal) { |
741 // 10.9.4 xnu-2422.110.17/bsd/kern/kern_exit.c proc_prepareexit() sets code[0] | 774 // 10.9.4 xnu-2422.110.17/bsd/kern/kern_exit.c proc_prepareexit() sets code[0] |
742 // based on the signal value, original exception type, and low 20 bits of the | 775 // based on the signal value, original exception type, and low 20 bits of the |
743 // original code[0] before calling xnu-2422.110.17/osfmk/kern/exception.c | 776 // original code[0] before calling xnu-2422.110.17/osfmk/kern/exception.c |
744 // task_exception_notify() to raise an EXC_CRASH. | 777 // task_exception_notify() to raise an EXC_CRASH. |
(...skipping 19 matching lines...) Expand all Loading... |
764 kern_return_t ExcServerSuccessfulReturnValue(exception_behavior_t behavior, | 797 kern_return_t ExcServerSuccessfulReturnValue(exception_behavior_t behavior, |
765 bool set_thread_state) { | 798 bool set_thread_state) { |
766 if (!set_thread_state && ExceptionBehaviorHasState(behavior)) { | 799 if (!set_thread_state && ExceptionBehaviorHasState(behavior)) { |
767 return MACH_RCV_PORT_DIED; | 800 return MACH_RCV_PORT_DIED; |
768 } | 801 } |
769 | 802 |
770 return KERN_SUCCESS; | 803 return KERN_SUCCESS; |
771 } | 804 } |
772 | 805 |
773 } // namespace crashpad | 806 } // namespace crashpad |
OLD | NEW |