1919#include " base/apple/mach_logging.h"
2020#include " base/check.h"
2121#include " base/logging.h"
22+ #include " handler/mac/crash_report_exception_handler.h"
2223#include " util/mach/composite_mach_message_server.h"
2324#include " util/mach/mach_extensions.h"
2425#include " util/mach/mach_message.h"
@@ -29,6 +30,49 @@ namespace crashpad {
2930
3031namespace {
3132
33+ // Custom server for handling payload messages
34+ class PayloadMessageServer : public MachMessageServer ::Interface {
35+ public:
36+ PayloadMessageServer (PayloadMessageHandler* handler) : handler_(handler) {}
37+
38+ PayloadMessageServer (const PayloadMessageServer&) = delete ;
39+ PayloadMessageServer& operator =(const PayloadMessageServer&) = delete ;
40+
41+ // MachMessageServer::Interface:
42+
43+ // Processes an incoming message and dispatches it to the appropriate handler.
44+ bool MachMessageServerFunction (const mach_msg_header_t * in_header,
45+ mach_msg_header_t * out_header,
46+ bool * destroy_complex_request) override {
47+ const PayloadMessage* message =
48+ ReceivePayloadMessage (in_header, out_header);
49+ if (message) {
50+ if (handler_) {
51+ handler_->HandlePayloadMessage (*message);
52+ }
53+ *destroy_complex_request = true ;
54+ return true ;
55+ }
56+
57+ return false ;
58+ }
59+
60+ std::set<mach_msg_id_t > MachMessageServerRequestIDs () override {
61+ return {kPayloadMessageID };
62+ }
63+
64+ mach_msg_size_t MachMessageServerRequestSize () override {
65+ return sizeof (PayloadMessage);
66+ }
67+
68+ mach_msg_size_t MachMessageServerReplySize () override {
69+ return sizeof (mig_reply_error_t ); // Minimal size for a proper Mach reply message
70+ }
71+
72+ private:
73+ PayloadMessageHandler* handler_; // weak
74+ };
75+
3276class ExceptionHandlerServerRun : public UniversalMachExcServer ::Interface,
3377 public NotifyServer::DefaultInterface {
3478 public:
@@ -41,6 +85,7 @@ class ExceptionHandlerServerRun : public UniversalMachExcServer::Interface,
4185 NotifyServer::DefaultInterface (),
4286 mach_exc_server_(this ),
4387 notify_server_(this ),
88+ payload_message_server_(dynamic_cast <CrashReportExceptionHandler*>(exception_interface)),
4489 composite_mach_message_server_(),
4590 exception_interface_(exception_interface),
4691 exception_port_(exception_port),
@@ -49,6 +94,7 @@ class ExceptionHandlerServerRun : public UniversalMachExcServer::Interface,
4994 launchd_(launchd) {
5095 composite_mach_message_server_.AddHandler (&mach_exc_server_);
5196 composite_mach_message_server_.AddHandler (¬ify_server_);
97+ composite_mach_message_server_.AddHandler (&payload_message_server_);
5298 }
5399
54100 ExceptionHandlerServerRun (const ExceptionHandlerServerRun&) = delete;
@@ -182,6 +228,7 @@ class ExceptionHandlerServerRun : public UniversalMachExcServer::Interface,
182228 private:
183229 UniversalMachExcServer mach_exc_server_;
184230 NotifyServer notify_server_;
231+ PayloadMessageServer payload_message_server_;
185232 CompositeMachMessageServer composite_mach_message_server_;
186233 UniversalMachExcServer::Interface* exception_interface_; // weak
187234 mach_port_t exception_port_; // weak
0 commit comments