fix: add back fallback wasm-trap handling (#47345)
* fix: add back fallback wasm-trap handling Refs https://chromium-review.googlesource.com/c/chromium/src/+/5372409 This change sets up wasm-trap handling for the case where content_shell has not enabled crash reporting but moves the responsibility to ElectronRendererClient. The default ContentRendererClient assumes that crash reporting is enabled (crashpad enabled by default) and does not set up its own handler. Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: fix build Co-authored-by: deepak1556 <hop2deep@gmail.com> --------- Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> Co-authored-by: deepak1556 <hop2deep@gmail.com>
This commit is contained in:
parent
e90404be7d
commit
d2c95a28bb
4 changed files with 61 additions and 31 deletions
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <algorithm>
|
||||
|
||||
#include "base/base_switches.h"
|
||||
#include "base/command_line.h"
|
||||
#include "base/containers/contains.h"
|
||||
#include "base/debug/stack_trace.h"
|
||||
|
|
@ -26,6 +27,13 @@
|
|||
#include "third_party/blink/renderer/core/execution_context/execution_context.h" // nogncheck
|
||||
#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" // nogncheck
|
||||
|
||||
#if BUILDFLAG(IS_LINUX) && (defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64))
|
||||
#define ENABLE_WEB_ASSEMBLY_TRAP_HANDLER_LINUX
|
||||
#include "components/crash/core/app/crashpad.h"
|
||||
#include "content/public/common/content_switches.h"
|
||||
#include "v8/include/v8-wasm-trap-handler-posix.h"
|
||||
#endif
|
||||
|
||||
namespace electron {
|
||||
|
||||
ElectronRendererClient::ElectronRendererClient()
|
||||
|
|
@ -36,6 +44,14 @@ ElectronRendererClient::ElectronRendererClient()
|
|||
|
||||
ElectronRendererClient::~ElectronRendererClient() = default;
|
||||
|
||||
void ElectronRendererClient::PostIOThreadCreated(
|
||||
base::SingleThreadTaskRunner* io_thread_task_runner) {
|
||||
// Freezing flags after init conflicts with node in the renderer.
|
||||
// We do this here in order to avoid having to patch the ctor in
|
||||
// content/renderer/render_process_impl.cc.
|
||||
v8::V8::SetFlagsFromString("--no-freeze-flags-after-init");
|
||||
}
|
||||
|
||||
void ElectronRendererClient::RenderFrameCreated(
|
||||
content::RenderFrame* render_frame) {
|
||||
new ElectronRenderFrameObserver(render_frame, this);
|
||||
|
|
@ -230,6 +246,48 @@ void ElectronRendererClient::WillDestroyWorkerContextOnWorkerThread(
|
|||
}
|
||||
}
|
||||
|
||||
void ElectronRendererClient::SetUpWebAssemblyTrapHandler() {
|
||||
// See CL:5372409 - copied from ShellContentRendererClient.
|
||||
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
|
||||
// Mac and Windows use the default implementation (where the default v8 trap
|
||||
// handler gets set up).
|
||||
ContentRendererClient::SetUpWebAssemblyTrapHandler();
|
||||
return;
|
||||
#elif defined(ENABLE_WEB_ASSEMBLY_TRAP_HANDLER_LINUX)
|
||||
const bool crash_reporter_enabled =
|
||||
crash_reporter::GetHandlerSocket(nullptr, nullptr);
|
||||
|
||||
if (crash_reporter_enabled) {
|
||||
// If either --enable-crash-reporter or --enable-crash-reporter-for-testing
|
||||
// is enabled it should take care of signal handling for us, use the default
|
||||
// implementation which doesn't register an additional handler.
|
||||
ContentRendererClient::SetUpWebAssemblyTrapHandler();
|
||||
return;
|
||||
}
|
||||
|
||||
const bool use_v8_default_handler =
|
||||
base::CommandLine::ForCurrentProcess()->HasSwitch(
|
||||
::switches::kDisableInProcessStackTraces);
|
||||
|
||||
if (use_v8_default_handler) {
|
||||
// There is no signal handler yet, but it's okay if v8 registers one.
|
||||
v8::V8::EnableWebAssemblyTrapHandler(/*use_v8_signal_handler=*/true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (base::debug::SetStackDumpFirstChanceCallback(
|
||||
v8::TryHandleWebAssemblyTrapPosix)) {
|
||||
// Crashpad and Breakpad are disabled, but the in-process stack dump
|
||||
// handlers are enabled, so set the callback on the stack dump handlers.
|
||||
v8::V8::EnableWebAssemblyTrapHandler(/*use_v8_signal_handler=*/false);
|
||||
return;
|
||||
}
|
||||
|
||||
// As the registration of the callback failed, we don't enable trap
|
||||
// handlers.
|
||||
#endif // defined(ENABLE_WEB_ASSEMBLY_TRAP_HANDLER_LINUX)
|
||||
}
|
||||
|
||||
node::Environment* ElectronRendererClient::GetEnvironment(
|
||||
content::RenderFrame* render_frame) const {
|
||||
if (!injected_frames_.contains(render_frame))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue