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