// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/mac/os_crash_dumps.h"

#include <signal.h>
#include <unistd.h>

#include "base/basictypes.h"
#include "base/logging.h"

namespace base {
namespace mac {

namespace {

void ExitSignalHandler(int sig) {
  // A call to exit() can call atexit() handlers.  If we SIGSEGV due
  // to a corrupt heap, and if we have an atexit handler that
  // allocates or frees memory, we are in trouble if we do not _exit.
  _exit(128 + sig);
}

}  // namespace

void DisableOSCrashDumps() {
  // These are the POSIX signals corresponding to the Mach exceptions that
  // Apple Crash Reporter handles.  See ux_exception() in xnu's
  // bsd/uxkern/ux_exception.c and machine_exception() in xnu's
  // bsd/dev/*/unix_signal.c.
  const int signals_to_intercept[] = {
    SIGILL,   // EXC_BAD_INSTRUCTION
    SIGTRAP,  // EXC_BREAKPOINT
    SIGFPE,   // EXC_ARITHMETIC
    SIGBUS,   // EXC_BAD_ACCESS
    SIGSEGV   // EXC_BAD_ACCESS
  };

  // For all these signals, just wire things up so we exit immediately.
  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
}  // namespace base
