13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/mac/os_crash_dumps.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <signal.h>
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <unistd.h>
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace base {
133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace mac {
143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace {
163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenvoid ExitSignalHandler(int sig) {
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // A call to exit() can call atexit() handlers.  If we SIGSEGV due
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to a corrupt heap, and if we have an atexit handler that
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // allocates or frees memory, we are in trouble if we do not _exit.
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  _exit(128 + sig);
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace
253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenvoid DisableOSCrashDumps() {
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // These are the POSIX signals corresponding to the Mach exceptions that
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Apple Crash Reporter handles.  See ux_exception() in xnu's
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // bsd/uxkern/ux_exception.c and machine_exception() in xnu's
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // bsd/dev/*/unix_signal.c.
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int signals_to_intercept[] = {
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SIGILL,   // EXC_BAD_INSTRUCTION
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SIGTRAP,  // EXC_BREAKPOINT
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SIGFPE,   // EXC_ARITHMETIC
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SIGBUS,   // EXC_BAD_ACCESS
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SIGSEGV   // EXC_BAD_ACCESS
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For all these signals, just wire things up so we exit immediately.
403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  for (size_t i = 0; i < arraysize(signals_to_intercept); ++i)
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    signal(signals_to_intercept[i], ExitSignalHandler);
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace mac
453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace base
46