aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/google_breakpad/processor/minidump.h2
-rw-r--r--src/processor/minidump.cc17
2 files changed, 13 insertions, 6 deletions
diff --git a/src/google_breakpad/processor/minidump.h b/src/google_breakpad/processor/minidump.h
index 9a135d2d..5c5dccc9 100644
--- a/src/google_breakpad/processor/minidump.h
+++ b/src/google_breakpad/processor/minidump.h
@@ -109,6 +109,8 @@ class MinidumpObject {
public:
virtual ~MinidumpObject() {}
+ bool valid() const { return valid_; }
+
protected:
explicit MinidumpObject(Minidump* minidump);
diff --git a/src/processor/minidump.cc b/src/processor/minidump.cc
index d91332c5..6126ceca 100644
--- a/src/processor/minidump.cc
+++ b/src/processor/minidump.cc
@@ -2279,15 +2279,20 @@ bool MinidumpModuleList::Read(u_int32_t expected_size) {
++module_index) {
MinidumpModule* module = &(*modules)[module_index];
- if (!module->ReadAuxiliaryData()) {
- BPLOG(INFO) << "MinidumpModuleList could not read module auxiliary "
- "data for module " <<
- module_index << "/" << module_count;
- continue;
+ // ReadAuxiliaryData fails if any data that the module indicates should
+ // exist is missing, but we treat some such cases as valid anyway. See
+ // issue #222: if a debugging record is of a format that's too large to
+ // handle, it shouldn't render the entire dump invalid. Check module
+ // validity before giving up.
+ if (!module->ReadAuxiliaryData() && !module->valid()) {
+ BPLOG(ERROR) << "MinidumpModuleList could not read required module "
+ "auxiliary data for module " <<
+ module_index << "/" << module_count;
+ return false;
}
// It is safe to use module->code_file() after successfully calling
- // module->ReadAuxiliaryData.
+ // module->ReadAuxiliaryData or noting that the module is valid.
u_int64_t base_address = module->base_address();
u_int64_t module_size = module->size();