From 0c2cb449762898a5502b8c2bb4b3533d1d6792ea Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Mon, 3 Apr 2023 15:25:21 -0700 Subject: [PATCH] fix: record helper error messages in electron_main_mac (#37810) Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Jeremy Rose --- shell/app/electron_main_mac.cc | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/shell/app/electron_main_mac.cc b/shell/app/electron_main_mac.cc index b32cb64968a0d..cd45a83c5a99f 100644 --- a/shell/app/electron_main_mac.cc +++ b/shell/app/electron_main_mac.cc @@ -18,6 +18,14 @@ #include "sandbox/mac/seatbelt_exec.h" // nogncheck #endif +extern "C" { +// abort_report_np() records the message in a special section that both the +// system CrashReporter and Crashpad collect in crash reports. Using a Crashpad +// Annotation would be preferable, but this executable cannot depend on +// Crashpad directly. +void abort_report_np(const char* fmt, ...); +} + namespace { [[maybe_unused]] bool IsEnvSet(const char* name) { @@ -25,6 +33,20 @@ namespace { return indicator && indicator[0] != '\0'; } +#if defined(HELPER_EXECUTABLE) && !IS_MAS_BUILD() +[[noreturn]] void FatalError(const char* format, ...) { + va_list valist; + va_start(valist, format); + char message[4096]; + if (vsnprintf(message, sizeof(message), format, valist) >= 0) { + fputs(message, stderr); + abort_report_np("%s", message); + } + va_end(valist); + abort(); +} +#endif + } // namespace int main(int argc, char* argv[]) { @@ -42,27 +64,23 @@ int main(int argc, char* argv[]) { uint32_t exec_path_size = 0; int rv = _NSGetExecutablePath(NULL, &exec_path_size); if (rv != -1) { - fprintf(stderr, "_NSGetExecutablePath: get length failed\n"); - abort(); + FatalError("_NSGetExecutablePath: get length failed."); } auto exec_path = std::make_unique(exec_path_size); rv = _NSGetExecutablePath(exec_path.get(), &exec_path_size); if (rv != 0) { - fprintf(stderr, "_NSGetExecutablePath: get path failed\n"); - abort(); + FatalError("_NSGetExecutablePath: get path failed."); } sandbox::SeatbeltExecServer::CreateFromArgumentsResult seatbelt = sandbox::SeatbeltExecServer::CreateFromArguments(exec_path.get(), argc, argv); if (seatbelt.sandbox_required) { if (!seatbelt.server) { - fprintf(stderr, "Failed to create seatbelt sandbox server.\n"); - abort(); + FatalError("Failed to create seatbelt sandbox server."); } if (!seatbelt.server->InitializeSandbox()) { - fprintf(stderr, "Failed to initialize sandbox.\n"); - abort(); + FatalError("Failed to initialize sandbox."); } } #endif // defined(HELPER_EXECUTABLE) && !IS_MAS_BUILD