| Index: crash_dumper.cc
|
| diff --git a/crash_dumper.cc b/crash_dumper.cc
|
| deleted file mode 100644
|
| index 52d18d7425d1d538db30bd3b5f157c6e71f0eb67..0000000000000000000000000000000000000000
|
| --- a/crash_dumper.cc
|
| +++ /dev/null
|
| @@ -1,136 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -//
|
| -// Simple wrapper and basic configuration of Google breakpad. We try
|
| -// to avoid using any unnecessary code (like libbase) to make it as
|
| -// non-intrusive as possible to link in this library.
|
| -
|
| -#include <errno.h>
|
| -#include <pwd.h>
|
| -#include <stddef.h>
|
| -#include <sys/stat.h>
|
| -#include <sys/types.h>
|
| -#include <unistd.h>
|
| -
|
| -#include "client/linux/handler/exception_handler.h"
|
| -#include "common/linux/linux_libc_support.h"
|
| -#include "common/linux/linux_syscall_support.h"
|
| -#include "crash/crash_dumper.h"
|
| -
|
| -// Define sys_mkdir (sys_open passes mode_t as int, so we do too).
|
| -LSS_INLINE _syscall2(int, mkdir, const char *, pathname, int, mode);
|
| -
|
| -static const char kDefaultUser[] = "chronos";
|
| -static const char kSystemCrashParentPath[] = "/var/spool";
|
| -static const char kSystemCrashPath[] = "/var/spool/crash";
|
| -static const char kUserCrashParentPath[] = "/home/chronos/user";
|
| -static const char kUserCrashPath[] = "/home/chronos/user/crash";
|
| -
|
| -// Pointers to paths, set when crash dumping is enabled.
|
| -static const char *s_crash_path;
|
| -static const char *s_crash_parent_path;
|
| -static mode_t s_dump_directory_mode;
|
| -
|
| -static bool s_any_crashes_occurred = false;
|
| -static google_breakpad::ExceptionHandler *s_breakpad_handler;
|
| -
|
| -static bool s_enabled = false;
|
| -
|
| -#define CHECK_CONDITION(_cond, _message) \
|
| - do { if (!(_cond)) { fputs(_message"\n", stderr); abort(); } } while(false)
|
| -
|
| -// This static object will cause anything that links in this object to get
|
| -// crash handling for the duration of this file's scope.
|
| -static CrashDumper g_crash_dumper;
|
| -
|
| -
|
| -// Prepare the crash path. Must avoid allocating memory.
|
| -static bool PrepareCrashPath() {
|
| - struct kernel_stat buf;
|
| - if (sys_stat(s_crash_path, &buf) < 0) {
|
| - // Dump directory does not exist, so create it and its parent now,
|
| - // at the time of the crash.
|
| - sys_mkdir(s_crash_parent_path, 755);
|
| - sys_mkdir(s_crash_path, s_dump_directory_mode);
|
| - }
|
| - return sys_stat(s_crash_path, &buf) == 0;
|
| -}
|
| -
|
| -// Use FilterCallback to avoid recursive crashing.
|
| -// TODO(kmixter): Also use it to avoid enqueuing too many crash dumps
|
| -// system wide - if we get in a crash/restart loop we don't want the entire
|
| -// stateful partition to be filled up.
|
| -static bool FilterCallback(void *) {
|
| - // This function runs in a compromised context - a crash has already
|
| - // occurred so memory allocation and libc should be avoided.
|
| - bool old_any_crashes_occured = s_any_crashes_occurred;
|
| - s_any_crashes_occurred = true;
|
| - // The crash path may have been removed or mounted-over, so make sure
|
| - // there is a container directory. If it fails, not much we can do.
|
| - PrepareCrashPath();
|
| - return !old_any_crashes_occured;
|
| -}
|
| -
|
| -static bool GetEffectiveUser(std::string *result) {
|
| - char storage[256];
|
| - struct passwd passwd_storage;
|
| - struct passwd *passwd_result = NULL;
|
| -
|
| - if (getpwuid_r(geteuid(), &passwd_storage, storage, sizeof(storage),
|
| - &passwd_result) != 0 || passwd_result == NULL) {
|
| - return false;
|
| - }
|
| -
|
| - *result = passwd_result->pw_name;
|
| - return true;
|
| -}
|
| -
|
| -void CrashDumper::Enable() {
|
| - CHECK_CONDITION(!s_enabled, "Crash handling already enabled");
|
| -
|
| - std::string name;
|
| - CHECK_CONDITION(GetEffectiveUser(&name),
|
| - "getpwuid_r failed, cannot enable crash reporting");
|
| -
|
| - if (name == kDefaultUser) {
|
| - // Crashes as "chronos" when the user is not yet logged in will
|
| - // still be recorded to /home/chronos/user/crash in the
|
| - // stateful partition (outside cryptohome). These will eventually
|
| - // be uploaded when no user is logged in.
|
| - s_crash_path = kUserCrashPath;
|
| - s_crash_parent_path = kUserCrashParentPath;
|
| - s_dump_directory_mode = 0755;
|
| - } else {
|
| - s_crash_path = kSystemCrashPath;
|
| - s_crash_parent_path = kSystemCrashParentPath;
|
| - // Make the dump directory sticky so any UID can write to
|
| - // it but not remove another UID's crashes.
|
| - s_dump_directory_mode = 01777;
|
| - }
|
| -
|
| - CHECK_CONDITION(PrepareCrashPath(), "Unable to create crash path");
|
| -
|
| - // Begin collecting crashes
|
| - s_breakpad_handler = new google_breakpad::ExceptionHandler(
|
| - s_crash_path,
|
| - FilterCallback,
|
| - NULL, // No minidump callback - sending happens asynchronously to writing
|
| - NULL, // No callback context necessary
|
| - true); // Install handler now.
|
| -
|
| - s_enabled = true;
|
| -}
|
| -
|
| -bool CrashDumper::IsEnabled() {
|
| - return s_enabled;
|
| -}
|
| -
|
| -void CrashDumper::Disable() {
|
| - CHECK_CONDITION(s_enabled, "Crash handling was not enabled");
|
| - delete s_breakpad_handler;
|
| - s_breakpad_handler = NULL;
|
| - s_crash_path = NULL;
|
| - s_crash_parent_path = NULL;
|
| - s_enabled = false;
|
| -}
|
|
|