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

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

Issue 2652133004: Sanitize mini- and microdumps for webview (Closed)
Patch Set: Robert's comments. Created 3 years, 10 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 | « components/crash/content/app/breakpad_linux.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/crash/content/app/breakpad_linux.cc
diff --git a/components/crash/content/app/breakpad_linux.cc b/components/crash/content/app/breakpad_linux.cc
index b621143ecbf2d3fd153272fbfe3b35b49efc4376..8ab9da84ad4f44f13cffeb52f548901e9b8e52bf 100644
--- a/components/crash/content/app/breakpad_linux.cc
+++ b/components/crash/content/app/breakpad_linux.cc
@@ -113,7 +113,11 @@ class MicrodumpInfo {
MicrodumpInfo()
: microdump_build_fingerprint_(nullptr),
microdump_product_info_(nullptr),
- microdump_gpu_fingerprint_(nullptr) {}
+ microdump_gpu_fingerprint_(nullptr),
+ microdump_process_type_(nullptr),
+ skip_dump_if_principal_mapping_not_referenced_(false),
+ address_within_principal_mapping_(0ul),
+ should_sanitize_dumps_(false) {}
// The order in which SetGpuFingerprint and Initialize are called
// may be dependent on the timing of the availability of GPU
@@ -129,6 +133,11 @@ class MicrodumpInfo {
// which a microdump is generated, then the GPU fingerprint will be
// UNKNOWN.
void SetGpuFingerprint(const std::string& gpu_fingerprint);
+ void SetSkipDumpIfPrincipalMappingNotReferenced(
+ uintptr_t address_within_principal_mapping);
+ void SetShouldSanitizeDumps(bool should_sanitize_dumps);
+ void UpdateMinidumpDescriptor(MinidumpDescriptor* minidump_descriptor);
+ void UpdateExceptionHandlers();
void Initialize(const std::string& process_type,
const char* product_name,
const char* product_version,
@@ -140,6 +149,9 @@ class MicrodumpInfo {
const char* microdump_product_info_;
const char* microdump_gpu_fingerprint_;
const char* microdump_process_type_;
+ bool skip_dump_if_principal_mapping_not_referenced_;
+ uintptr_t address_within_principal_mapping_;
+ bool should_sanitize_dumps_;
};
base::LazyInstance<MicrodumpInfo> g_microdump_info =
@@ -730,7 +742,12 @@ void DumpProcess() {
#if defined(OS_ANDROID)
// Don't use g_breakpad and g_microdump directly here, because their
// output might currently be suppressed.
- if (g_breakpad) {
+
+ // If a breakpad handler is installed, but its target is a file
+ // descriptor, we can't generate a dump because we can't risk
+ // writing multiple minidumps to the FD, so it can only be used for
+ // dumps that are associated with a crash.
+ if (g_breakpad && !g_breakpad->minidump_descriptor().IsFD()) {
ExceptionHandler(g_breakpad->minidump_descriptor(),
nullptr,
CrashDoneNoUpload,
@@ -788,6 +805,7 @@ void EnableCrashDumping(bool unattended) {
}
#if defined(OS_ANDROID)
unattended = true; // Android never uploads directly.
+ g_microdump_info.Get().UpdateMinidumpDescriptor(&minidump_descriptor);
#endif
if (unattended) {
g_breakpad = new ExceptionHandler(
@@ -841,8 +859,10 @@ bool CrashDoneInProcessNoUpload(
// WARNING: this code runs in a compromised context. It may not call into
// libc nor allocate memory normally.
if (!succeeded) {
- static const char msg[] = "Crash dump generation failed.\n";
- WriteLog(msg, sizeof(msg) - 1);
+ if (ShouldGenerateDump(nullptr)) {
+ static const char msg[] = "Crash dump generation failed.\n";
+ WriteLog(msg, sizeof(msg) - 1);
+ }
return false;
}
@@ -890,8 +910,12 @@ void EnableNonBrowserCrashDumping(const std::string& process_type,
const size_t process_type_len = process_type.size() + 1;
g_process_type = new char[process_type_len];
strncpy(g_process_type, process_type.c_str(), process_type_len);
- new ExceptionHandler(MinidumpDescriptor(minidump_fd), ShouldGenerateDump,
- CrashDoneInProcessNoUpload, nullptr, true, -1);
+
+ MinidumpDescriptor descriptor(minidump_fd);
+ g_microdump_info.Get().UpdateMinidumpDescriptor(&descriptor);
+ g_breakpad =
+ new ExceptionHandler(descriptor, ShouldGenerateDump,
+ CrashDoneInProcessNoUpload, nullptr, true, -1);
}
void MicrodumpInfo::SetGpuFingerprint(const std::string& gpu_fingerprint) {
@@ -900,11 +924,52 @@ void MicrodumpInfo::SetGpuFingerprint(const std::string& gpu_fingerprint) {
microdump_gpu_fingerprint_ = strdup(gpu_fingerprint.c_str());
ANNOTATE_LEAKING_OBJECT_PTR(microdump_gpu_fingerprint_);
+ UpdateExceptionHandlers();
+}
+
+void MicrodumpInfo::SetSkipDumpIfPrincipalMappingNotReferenced(
+ uintptr_t address_within_principal_mapping) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ skip_dump_if_principal_mapping_not_referenced_ = true;
+ address_within_principal_mapping_ = address_within_principal_mapping;
+
+ UpdateExceptionHandlers();
+}
+
+void MicrodumpInfo::SetShouldSanitizeDumps(bool should_sanitize_dumps) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ should_sanitize_dumps_ = should_sanitize_dumps;
+
+ UpdateExceptionHandlers();
+}
+
+void MicrodumpInfo::UpdateMinidumpDescriptor(
+ MinidumpDescriptor* minidump_descriptor) {
+ google_breakpad::MicrodumpExtraInfo* microdump_extra_info =
+ minidump_descriptor->microdump_extra_info();
+
+ minidump_descriptor->set_skip_dump_if_principal_mapping_not_referenced(
+ skip_dump_if_principal_mapping_not_referenced_);
+ minidump_descriptor->set_address_within_principal_mapping(
+ address_within_principal_mapping_);
+ minidump_descriptor->set_sanitize_stacks(should_sanitize_dumps_);
+
+ microdump_extra_info->gpu_fingerprint = microdump_gpu_fingerprint_;
+ microdump_extra_info->product_info = microdump_product_info_;
+ microdump_extra_info->process_type = microdump_process_type_;
+ microdump_extra_info->build_fingerprint = microdump_build_fingerprint_;
+}
+
+void MicrodumpInfo::UpdateExceptionHandlers() {
+ if (g_breakpad) {
+ MinidumpDescriptor descriptor(g_breakpad->minidump_descriptor());
+ UpdateMinidumpDescriptor(&descriptor);
+ g_breakpad->set_minidump_descriptor(descriptor);
+ }
if (g_microdump) {
- MinidumpDescriptor minidump_descriptor(g_microdump->minidump_descriptor());
- minidump_descriptor.microdump_extra_info()->gpu_fingerprint =
- microdump_gpu_fingerprint_;
- g_microdump->set_minidump_descriptor(minidump_descriptor);
+ MinidumpDescriptor descriptor(g_microdump->minidump_descriptor());
+ UpdateMinidumpDescriptor(&descriptor);
+ g_microdump->set_minidump_descriptor(descriptor);
}
}
@@ -927,25 +992,18 @@ void MicrodumpInfo::Initialize(const std::string& process_type,
microdump_product_info_ =
strdup((product_name + std::string(":") + product_version).c_str());
ANNOTATE_LEAKING_OBJECT_PTR(microdump_product_info_);
- descriptor.microdump_extra_info()->product_info = microdump_product_info_;
}
microdump_process_type_ =
strdup(process_type.empty() ? kBrowserProcessType : process_type.c_str());
ANNOTATE_LEAKING_OBJECT_PTR(microdump_process_type_);
- descriptor.microdump_extra_info()->process_type = microdump_process_type_;
if (android_build_fp) {
microdump_build_fingerprint_ = strdup(android_build_fp);
ANNOTATE_LEAKING_OBJECT_PTR(microdump_build_fingerprint_);
- descriptor.microdump_extra_info()->build_fingerprint =
- microdump_build_fingerprint_;
}
- if (microdump_gpu_fingerprint_) {
- descriptor.microdump_extra_info()->gpu_fingerprint =
- microdump_gpu_fingerprint_;
- }
+ UpdateMinidumpDescriptor(&descriptor);
g_microdump =
new ExceptionHandler(descriptor, ShouldGenerateDump, MicrodumpCrashDone,
@@ -2003,6 +2061,16 @@ void GenerateMinidumpOnDemandForAndroid(int dump_fd) {
void SuppressDumpGeneration() {
g_dumps_suppressed = G_DUMPS_SUPPRESSED_MAGIC;
}
+
+void SetSkipDumpIfPrincipalMappingNotReferenced(
+ uintptr_t address_within_principal_mapping) {
+ g_microdump_info.Get().SetSkipDumpIfPrincipalMappingNotReferenced(
+ address_within_principal_mapping);
+}
+
+void SetShouldSanitizeDumps(bool should_sanitize_dumps) {
+ g_microdump_info.Get().SetShouldSanitizeDumps(should_sanitize_dumps);
+}
#endif // OS_ANDROID
bool IsCrashReporterEnabled() {
« no previous file with comments | « components/crash/content/app/breakpad_linux.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698