Bug 1403668 - Use SA_ONSTACK for several SIGSEGV handlers. r?ted draft
authorChristian Holler <choller@mozilla.com>
Sat, 07 Oct 2017 17:59:37 +0200
changeset 676465 62a6489b71ace8e2cddf01acf554282091147c7b
parent 676463 7fd42c49a7563608d2d3395387d4a230201c26ee
child 734934 6bcbbed9ee84b47b4439727cdec28ae407660680
push id83489
push usercholler@mozilla.com
push dateSat, 07 Oct 2017 16:03:54 +0000
reviewersted
bugs1403668
milestone58.0a1
Bug 1403668 - Use SA_ONSTACK for several SIGSEGV handlers. r?ted MozReview-Commit-ID: IwVYiBF3Ek8
js/src/ds/MemoryProtectionExceptionHandler.cpp
js/src/wasm/WasmSignalHandlers.cpp
toolkit/profile/nsProfileLock.cpp
--- a/js/src/ds/MemoryProtectionExceptionHandler.cpp
+++ b/js/src/ds/MemoryProtectionExceptionHandler.cpp
@@ -277,17 +277,17 @@ MemoryProtectionExceptionHandler::instal
     MOZ_ASSERT(!sExceptionHandlerInstalled);
 
     // If the exception handler is disabled, report success anyway.
     if (MemoryProtectionExceptionHandler::isDisabled())
         return true;
 
     // Install our new exception handler and save the previous one.
     struct sigaction faultHandler = {};
-    faultHandler.sa_flags = SA_SIGINFO | SA_NODEFER;
+    faultHandler.sa_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK;
     faultHandler.sa_sigaction = UnixExceptionHandler;
     sigemptyset(&faultHandler.sa_mask);
     sExceptionHandlerInstalled = !sigaction(SIGSEGV, &faultHandler, &sPrevSEGVHandler);
 
     return sExceptionHandlerInstalled;
 }
 
 void
--- a/js/src/wasm/WasmSignalHandlers.cpp
+++ b/js/src/wasm/WasmSignalHandlers.cpp
@@ -1612,26 +1612,26 @@ ProcessHasSignalHandlers()
     // install WasmFaultHandler.
 # else
     // SA_NODEFER allows us to reenter the signal handler if we crash while
     // handling the signal, and fall through to the Breakpad handler by testing
     // handlingSegFault.
 
     // Allow handling OOB with signals on all architectures
     struct sigaction faultHandler;
-    faultHandler.sa_flags = SA_SIGINFO | SA_NODEFER;
+    faultHandler.sa_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK;
     faultHandler.sa_sigaction = WasmFaultHandler<Signal::SegFault>;
     sigemptyset(&faultHandler.sa_mask);
     if (sigaction(SIGSEGV, &faultHandler, &sPrevSEGVHandler))
         MOZ_CRASH("unable to install segv handler");
 
 #  if defined(JS_CODEGEN_ARM)
     // On Arm Handle Unaligned Accesses
     struct sigaction busHandler;
-    busHandler.sa_flags = SA_SIGINFO | SA_NODEFER;
+    busHandler.sa_flags = SA_SIGINFO | SA_NODEFER | SA_ONSTACK;
     busHandler.sa_sigaction = WasmFaultHandler<Signal::BusError>;
     sigemptyset(&busHandler.sa_mask);
     if (sigaction(SIGBUS, &busHandler, &sPrevSIGBUSHandler))
         MOZ_CRASH("unable to install sigbus handler");
 #  endif
 # endif
 
     sHaveSignalHandlers = true;
--- a/toolkit/profile/nsProfileLock.cpp
+++ b/toolkit/profile/nsProfileLock.cpp
@@ -369,17 +369,17 @@ nsresult nsProfileLock::LockWithSymlink(
 
                 // Clean up on abnormal termination, using POSIX sigaction.
                 // Don't arm a handler if the signal is being ignored, e.g.,
                 // because mozilla is run via nohup.
                 if (!sDisableSignalHandling) {
                     struct sigaction act, oldact;
 #ifdef SA_SIGINFO
                     act.sa_sigaction = FatalSignalHandler;
-                    act.sa_flags = SA_SIGINFO;
+                    act.sa_flags = SA_SIGINFO | SA_ONSTACK;
 #else
                     act.sa_handler = FatalSignalHandler;
 #endif
                     sigfillset(&act.sa_mask);
 
 #define CATCH_SIGNAL(signame)                                           \
 PR_BEGIN_MACRO                                                          \
   if (sigaction(signame, nullptr, &oldact) == 0 &&                      \