Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1482)

Unified Diff: components/crash/app/breakpad_linux.cc

Issue 1019663003: Roll breakpad r1454:r1456 and add product info in microdumps (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: null string check Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « DEPS ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/crash/app/breakpad_linux.cc
diff --git a/components/crash/app/breakpad_linux.cc b/components/crash/app/breakpad_linux.cc
index 03ce34b1089d0baf441b940ed65a8212ee20b7d6..393c60492f953459e26d4f643b15c71b3dcbcee5 100644
--- a/components/crash/app/breakpad_linux.cc
+++ b/components/crash/app/breakpad_linux.cc
@@ -49,6 +49,7 @@
#include "base/android/build_info.h"
#include "base/android/path_utils.h"
+#include "base/debug/leak_annotations.h"
#endif
#include "third_party/lss/linux_syscall_support.h"
@@ -85,18 +86,20 @@ const char kUploadURL[] = "https://clients2.google.com/cr/report";
bool g_is_crash_reporter_enabled = false;
uint64_t g_process_start_time = 0;
pid_t g_pid = 0;
-char* g_crash_log_path = NULL;
-ExceptionHandler* g_breakpad = NULL;
-ExceptionHandler* g_microdump = NULL;
+char* g_crash_log_path = nullptr;
+ExceptionHandler* g_breakpad = nullptr;
#if defined(ADDRESS_SANITIZER)
-const char* g_asan_report_str = NULL;
+const char* g_asan_report_str = nullptr;
#endif
#if defined(OS_ANDROID)
-char* g_process_type = NULL;
+char* g_process_type = nullptr;
+ExceptionHandler* g_microdump = nullptr;
+const char* g_microdump_build_fingerprint = nullptr;
+const char* g_microdump_product_info = nullptr;
#endif
-CrashKeyStorage* g_crash_keys = NULL;
+CrashKeyStorage* g_crash_keys = nullptr;
// Writes the value |v| as 16 hex characters to the memory pointed at by
// |output|.
@@ -133,7 +136,7 @@ const size_t kUint64StringSize = 21;
void SetProcessStartTime() {
// Set the base process start time value.
struct timeval tv;
- if (!gettimeofday(&tv, NULL))
+ if (!gettimeofday(&tv, nullptr))
g_process_start_time = timeval_to_ms(&tv);
else
g_process_start_time = 0;
@@ -512,9 +515,11 @@ void DumpProcess() {
if (g_breakpad)
g_breakpad->WriteMinidump();
+#if defined(OS_ANDROID)
// If microdumps are enabled write also a microdump on the system log.
if (g_microdump)
g_microdump->WriteMinidump();
+#endif
}
#if defined(OS_ANDROID)
@@ -678,9 +683,9 @@ void EnableCrashDumping(bool unattended) {
if (unattended) {
g_breakpad = new ExceptionHandler(
minidump_descriptor,
- NULL,
+ nullptr,
CrashDoneNoUpload,
- NULL,
+ nullptr,
true, // Install handlers.
-1); // Server file descriptor. -1 for in-process.
return;
@@ -690,9 +695,9 @@ void EnableCrashDumping(bool unattended) {
// Attended mode
g_breakpad = new ExceptionHandler(
minidump_descriptor,
- NULL,
+ nullptr,
CrashDoneUpload,
- NULL,
+ nullptr,
true, // Install handlers.
-1); // Server file descriptor. -1 for in-process.
#endif
@@ -710,7 +715,7 @@ bool MicrodumpCrashDone(const MinidumpDescriptor& minidump,
return false;
}
- const bool is_browser_process = (context != NULL);
+ const bool is_browser_process = (context != nullptr);
return FinalizeCrashDoneAndroid(is_browser_process);
}
@@ -729,11 +734,37 @@ void InitMicrodumpCrashHandlerIfNecessary(const std::string& process_type) {
VLOG(1) << "Enabling microdumps crash handler (process_type:"
<< process_type << ")";
+
+ // The exception handler runs in a compromised context and cannot use c_str()
+ // as that would require the heap. Therefore, we have to guarantee that the
+ // build fingerprint and product info pointers are always valid.
+ const char* product_name = nullptr;
+ const char* product_version = nullptr;
+ GetCrashReporterClient()->GetProductNameAndVersion(&product_name,
+ &product_version);
+
+ MinidumpDescriptor descriptor(MinidumpDescriptor::kMicrodumpOnConsole);
+
+ if (product_name && product_version) {
+ g_microdump_product_info = strdup(
+ (product_name + std::string(":") + product_version).c_str());
+ ANNOTATE_LEAKING_OBJECT_PTR(g_microdump_product_info);
+ descriptor.SetMicrodumpProductInfo(g_microdump_product_info);
+ }
+
+ const char* android_build_fp =
+ base::android::BuildInfo::GetInstance()->android_build_fp();
+ if (android_build_fp) {
+ g_microdump_build_fingerprint = strdup(android_build_fp);
+ ANNOTATE_LEAKING_OBJECT_PTR(g_microdump_build_fingerprint);
+ descriptor.SetMicrodumpBuildFingerprint(g_microdump_build_fingerprint);
+ }
+
DCHECK(!g_microdump);
bool is_browser_process = process_type.empty() || process_type == "webview";
g_microdump = new ExceptionHandler(
- MinidumpDescriptor(MinidumpDescriptor::kMicrodumpOnConsole),
- NULL,
+ descriptor,
+ nullptr,
MicrodumpCrashDone,
reinterpret_cast<void*>(is_browser_process),
true, // Install handlers.
@@ -755,11 +786,11 @@ bool CrashDoneInProcessNoUpload(
// Start constructing the message to send to the browser.
BreakpadInfo info = {0};
- info.filename = NULL;
+ info.filename = nullptr;
info.fd = descriptor.fd();
info.process_type = g_process_type;
info.process_type_length = my_strlen(g_process_type);
- info.distro = NULL;
+ info.distro = nullptr;
info.distro_length = 0;
info.upload = false;
info.process_start_time = g_process_start_time;
@@ -798,7 +829,7 @@ void EnableNonBrowserCrashDumping(const std::string& process_type,
g_process_type = new char[process_type_len];
strncpy(g_process_type, process_type.c_str(), process_type_len);
new google_breakpad::ExceptionHandler(MinidumpDescriptor(minidump_fd),
- NULL, CrashDoneInProcessNoUpload, NULL, true, -1);
+ nullptr, CrashDoneInProcessNoUpload, nullptr, true, -1);
}
#else
// Non-Browser = Extension, Gpu, Plugins, Ppapi and Renderer
@@ -902,9 +933,9 @@ void EnableNonBrowserCrashDumping() {
g_breakpad = new ExceptionHandler(
MinidumpDescriptor("/tmp"), // Unused but needed or Breakpad will assert.
- NULL,
- NULL,
- NULL,
+ nullptr,
+ nullptr,
+ nullptr,
true,
-1);
g_breakpad->set_crash_generation_client(new NonBrowserCrashHandler());
@@ -1057,7 +1088,7 @@ void ExecUploadProcessOrTerminate(const BreakpadInfo& info,
pid_flag,
uid_flag,
exe_flag,
- NULL,
+ nullptr,
};
static const char msg[] = "Cannot upload crash dump: cannot exec "
"/sbin/crash_reporter\n";
@@ -1092,7 +1123,7 @@ void ExecUploadProcessOrTerminate(const BreakpadInfo& info,
"--tries=1", // Don't retry if the upload fails.
"-O", // output reply to fd 3
"/dev/fd/3",
- NULL,
+ nullptr,
};
static const char msg[] = "Cannot upload crash dump: cannot exec "
"/usr/bin/wget\n";
@@ -1137,7 +1168,7 @@ size_t WaitForCrashReportUploadProcess(int fd, size_t bytes_to_read,
return bytes_read;
}
-// |buf| should be |expected_len| + 1 characters in size and NULL terminated.
+// |buf| should be |expected_len| + 1 characters in size and nullptr terminated.
bool IsValidCrashReportId(const char* buf, size_t bytes_read,
size_t expected_len) {
if (bytes_read != expected_len)
@@ -1153,7 +1184,7 @@ bool IsValidCrashReportId(const char* buf, size_t bytes_read,
#endif
}
-// |buf| should be |expected_len| + 1 characters in size and NULL terminated.
+// |buf| should be |expected_len| + 1 characters in size and nullptr terminated.
void HandleCrashReportId(const char* buf, size_t bytes_read,
size_t expected_len) {
WriteNewline();
@@ -1186,7 +1217,7 @@ void HandleCrashReportId(const char* buf, size_t bytes_read,
// Write crash dump id to crash log as: seconds_since_epoch,crash_id
struct kernel_timeval tv;
- if (g_crash_log_path && !sys_gettimeofday(&tv, NULL)) {
+ if (g_crash_log_path && !sys_gettimeofday(&tv, nullptr)) {
uint64_t time = kernel_timeval_to_ms(&tv) / 1000;
char time_str[kUint64StringSize];
const unsigned time_len = my_uint64_len(time);
@@ -1241,7 +1272,7 @@ void HandleCrashDump(const BreakpadInfo& info) {
size_t dump_size;
uint8_t* dump_data;
google_breakpad::PageAllocator allocator;
- const char* exe_buf = NULL;
+ const char* exe_buf = nullptr;
if (GetCrashReporterClient()->HandleCrashDump(info.filename)) {
return;
@@ -1436,7 +1467,7 @@ void HandleCrashDump(const BreakpadInfo& info) {
writer.AddBoundary();
writer.AddPairString(brand, android_build_info->brand());
writer.AddBoundary();
- if (android_build_info->java_exception_info() != NULL) {
+ if (android_build_info->java_exception_info() != nullptr) {
writer.AddPairString(exception_info,
android_build_info->java_exception_info());
writer.AddBoundary();
@@ -1447,7 +1478,7 @@ void HandleCrashDump(const BreakpadInfo& info) {
if (info.process_start_time > 0) {
struct kernel_timeval tv;
- if (!sys_gettimeofday(&tv, NULL)) {
+ if (!sys_gettimeofday(&tv, nullptr)) {
uint64_t time = kernel_timeval_to_ms(&tv);
if (time > info.process_start_time) {
time -= info.process_start_time;
@@ -1606,7 +1637,7 @@ void HandleCrashDump(const BreakpadInfo& info) {
WaitForCrashReportUploadProcess(fds[0], kCrashIdLength, id_buf);
HandleCrashReportId(id_buf, bytes_read, kCrashIdLength);
- if (sys_waitpid(upload_child, NULL, WNOHANG) == 0) {
+ if (sys_waitpid(upload_child, nullptr, WNOHANG) == 0) {
// Upload process is still around, kill it.
sys_kill(upload_child, SIGKILL);
}
@@ -1625,7 +1656,7 @@ void HandleCrashDump(const BreakpadInfo& info) {
// Main browser process.
if (child <= 0)
return;
- (void) HANDLE_EINTR(sys_waitpid(child, NULL, 0));
+ (void) HANDLE_EINTR(sys_waitpid(child, nullptr, 0));
}
void InitCrashReporter(const std::string& process_type) {
« no previous file with comments | « DEPS ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698