summaryrefslogtreecommitdiffstats
path: root/base/mac/os_crash_dumps.cc
diff options
context:
space:
mode:
authormseaborn@chromium.org <mseaborn@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-25 00:17:52 +0000
committermseaborn@chromium.org <mseaborn@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-25 00:17:52 +0000
commit81fb27f4553c0a13fa1fb16b240b4eb1444db183 (patch)
tree53498b6128d3b9f548628410f502afb36b776a9a /base/mac/os_crash_dumps.cc
parentbff706b5af5185a8f97e7046ca437a9ab4c1fc3c (diff)
downloadchromium_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.cc16
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