From 517a93dd2e47dffae019373efee19ba14a133ec0 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 6 Aug 2020 07:10:18 -0400 Subject: [PATCH 1/2] src: set SA_SIGINFO flag when using sa_sigaction For `sigaction()` the `SA_SIGINFO` flag should be set when setting the handler via the `sa_sigaction` member of the `sigaction` struct. --- src/node.cc | 3 ++- test/addons/register-signal-handler/binding.cc | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/node.cc b/src/node.cc index d68c6d8d148a38..71dfd433668831 100644 --- a/src/node.cc +++ b/src/node.cc @@ -543,7 +543,7 @@ void RegisterSignalHandler(int signal, struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_sigaction = handler; - sa.sa_flags = reset_handler ? SA_RESETHAND : 0; + sa.sa_flags = reset_handler ? SA_RESETHAND | SA_SIGINFO : SA_SIGINFO; sigfillset(&sa.sa_mask); CHECK_EQ(sigaction(signal, &sa, nullptr), 0); } @@ -638,6 +638,7 @@ inline void PlatformInit() { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_sigaction = TrapWebAssemblyOrContinue; + sa.sa_flags = SA_SIGINFO; CHECK_EQ(sigaction(SIGSEGV, &sa, nullptr), 0); } V8::EnableWebAssemblyTrapHandler(false); diff --git a/test/addons/register-signal-handler/binding.cc b/test/addons/register-signal-handler/binding.cc index 01580578d159c4..60b3f77521eeda 100644 --- a/test/addons/register-signal-handler/binding.cc +++ b/test/addons/register-signal-handler/binding.cc @@ -13,6 +13,7 @@ using v8::Value; void Handler(int signo, siginfo_t* siginfo, void* ucontext) { char signo_char = signo; int written; + assert(signo == siginfo->si_signo); do { written = write(1, &signo_char, 1); // write() is signal-safe. } while (written == -1 && errno == EINTR); From f594659350e31c7a882fdc23f5233a12d5355cbe Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 6 Aug 2020 23:55:27 +0100 Subject: [PATCH 2/2] fixup! src: set SA_SIGINFO flag when using sa_sigaction Co-authored-by: James M Snell --- src/node.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node.cc b/src/node.cc index 71dfd433668831..c390126954af60 100644 --- a/src/node.cc +++ b/src/node.cc @@ -543,7 +543,7 @@ void RegisterSignalHandler(int signal, struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_sigaction = handler; - sa.sa_flags = reset_handler ? SA_RESETHAND | SA_SIGINFO : SA_SIGINFO; + sa.sa_flags = SA_SIGINFO | (reset_handler ? SA_RESETHAND : 0); sigfillset(&sa.sa_mask); CHECK_EQ(sigaction(signal, &sa, nullptr), 0); }