diff options
Diffstat (limited to 'src/processor/minidump.cc')
-rw-r--r-- | src/processor/minidump.cc | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/src/processor/minidump.cc b/src/processor/minidump.cc index 135770d5..83f72b97 100644 --- a/src/processor/minidump.cc +++ b/src/processor/minidump.cc @@ -32,6 +32,10 @@ // // Author: Mark Mentovai +#ifdef HAVE_CONFIG_H +#include <config.h> // Must come first +#endif + #include "google_breakpad/processor/minidump.h" #include <assert.h> @@ -72,6 +76,11 @@ using std::vector; namespace { +// Limit arrived at by adding up possible states in Intel Ch. 13.5 X-SAVE +// MANAGED STATE +// (~ 3680 bytes) plus some extra for the future. +const uint32_t kMaxXSaveAreaSize = 16384; + // Returns true iff |context_size| matches exactly one of the sizes of the // various MDRawContext* types. // TODO(blundell): This function can be removed once @@ -503,6 +512,10 @@ bool MinidumpContext::Read(uint32_t expected_size) { // sizeof(MDRawContextAMD64). For now we skip this extended data. if (expected_size > sizeof(MDRawContextAMD64)) { size_t bytes_left = expected_size - sizeof(MDRawContextAMD64); + if (bytes_left > kMaxXSaveAreaSize) { + BPLOG(ERROR) << "MinidumpContext oversized xstate area"; + return false; + } std::vector<uint8_t> xstate(bytes_left); if (!minidump_->ReadBytes(xstate.data(), bytes_left)) { @@ -1246,12 +1259,11 @@ bool MinidumpContext::Read(uint32_t expected_size) { Swap(&context_riscv->t5); Swap(&context_riscv->t6); - for (int fpr_index = 0; - fpr_index < MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT; + for (int fpr_index = 0; fpr_index < MD_CONTEXT_RISCV_FPR_COUNT; ++fpr_index) { - Swap(&context_riscv->float_save.regs[fpr_index]); + Swap(&context_riscv->fpregs[fpr_index]); } - Swap(&context_riscv->float_save.fpcsr); + Swap(&context_riscv->fcsr); } SetContextRISCV(context_riscv.release()); @@ -1325,12 +1337,11 @@ bool MinidumpContext::Read(uint32_t expected_size) { Swap(&context_riscv64->t5); Swap(&context_riscv64->t6); - for (int fpr_index = 0; - fpr_index < MD_FLOATINGSAVEAREA_RISCV_FPR_COUNT; + for (int fpr_index = 0; fpr_index < MD_CONTEXT_RISCV_FPR_COUNT; ++fpr_index) { - Swap(&context_riscv64->float_save.regs[fpr_index]); + Swap(&context_riscv64->fpregs[fpr_index]); } - Swap(&context_riscv64->float_save.fpcsr); + Swap(&context_riscv64->fcsr); } SetContextRISCV64(context_riscv64.release()); @@ -5479,6 +5490,27 @@ void MinidumpCrashpadInfo::Print() { printf(" module_list[%d].simple_annotations[\"%s\"] = %s\n", module_index, annot.first.c_str(), annot.second.c_str()); } + const auto& crashpad_annots = + module_crashpad_info_annotation_objects_[module_index]; + for (const AnnotationObject& annot : crashpad_annots) { + std::string str_value; + if (annot.type == 1) { + // Value represents a C-style string. + for (const uint8_t& v : annot.value) { + str_value.append(1, static_cast<char>(v)); + } + } else { + // Value represents something else. + char buffer[3]; + for (const uint8_t& v : annot.value) { + snprintf(buffer, sizeof(buffer), "%02X", v); + str_value.append(buffer); + } + } + printf( + " module_list[%d].crashpad_annotations[\"%s\"] (type = %u) = %s\n", + module_index, annot.name.c_str(), annot.type, str_value.c_str()); + } printf(" address_mask = %" PRIu64 "\n", crashpad_info_.address_mask); } |