diff options
author | mseaborn@chromium.org <mseaborn@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-25 00:17:52 +0000 |
---|---|---|
committer | mseaborn@chromium.org <mseaborn@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-25 00:17:52 +0000 |
commit | 81fb27f4553c0a13fa1fb16b240b4eb1444db183 (patch) | |
tree | 53498b6128d3b9f548628410f502afb36b776a9a /base/mac/os_crash_dumps.cc | |
parent | bff706b5af5185a8f97e7046ca437a9ab4c1fc3c (diff) | |
download | chromium_src-81fb27f4553c0a13fa1fb16b240b4eb1444db183.zip chromium_src-81fb27f4553c0a13fa1fb16b240b4eb1444db183.tar.gz chromium_src-81fb27f4553c0a13fa1fb16b240b4eb1444db183.tar.bz2 |
Mac: Ensure signal handlers run on the sigaltstack() stack
This is generally safer. Using SA_ONSTACK for signal handlers
whenever possible is good practice and can't hurt.
BUG=https://code.google.com/p/nativeclient/issues/detail?id=3265
TEST=none
Review URL: https://codereview.chromium.org/12047034
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178706 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/mac/os_crash_dumps.cc')
-rw-r--r-- | base/mac/os_crash_dumps.cc | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/base/mac/os_crash_dumps.cc b/base/mac/os_crash_dumps.cc index e82fd73..e6b0996 100644 --- a/base/mac/os_crash_dumps.cc +++ b/base/mac/os_crash_dumps.cc @@ -8,6 +8,7 @@ #include <unistd.h> #include "base/basictypes.h" +#include "base/logging.h" namespace base { namespace mac { @@ -37,8 +38,19 @@ void DisableOSCrashDumps() { }; // For all these signals, just wire things up so we exit immediately. - for (size_t i = 0; i < arraysize(signals_to_intercept); ++i) - signal(signals_to_intercept[i], ExitSignalHandler); + for (size_t i = 0; i < arraysize(signals_to_intercept); ++i) { + struct sigaction act = {}; + act.sa_handler = ExitSignalHandler; + + // It is better to allow the signal handler to run on the stack + // registered with sigaltstack(), if one is present. + act.sa_flags = SA_ONSTACK; + + if (sigemptyset(&act.sa_mask) != 0) + DLOG_ERRNO(FATAL) << "sigemptyset() failed"; + if (sigaction(signals_to_intercept[i], &act, NULL) != 0) + DLOG_ERRNO(FATAL) << "sigaction() failed"; + } } } // namespace mac |