diff options
Diffstat (limited to 'src/client/linux/handler')
-rw-r--r-- | src/client/linux/handler/exception_handler.cc | 11 | ||||
-rw-r--r-- | src/client/linux/handler/minidump_descriptor.cc | 17 | ||||
-rw-r--r-- | src/client/linux/handler/minidump_descriptor.h | 40 |
3 files changed, 59 insertions, 9 deletions
diff --git a/src/client/linux/handler/exception_handler.cc b/src/client/linux/handler/exception_handler.cc index e515a73b..dca7e7f0 100644 --- a/src/client/linux/handler/exception_handler.cc +++ b/src/client/linux/handler/exception_handler.cc @@ -570,10 +570,13 @@ void ExceptionHandler::WaitForContinueSignal() { bool ExceptionHandler::DoDump(pid_t crashing_process, const void* context, size_t context_size) { if (minidump_descriptor_.IsMicrodumpOnConsole()) { - return google_breakpad::WriteMicrodump(crashing_process, - context, - context_size, - mapping_list_); + return google_breakpad::WriteMicrodump( + crashing_process, + context, + context_size, + mapping_list_, + minidump_descriptor_.microdump_build_fingerprint(), + minidump_descriptor_.microdump_product_info()); } if (minidump_descriptor_.IsFD()) { return google_breakpad::WriteMinidump(minidump_descriptor_.fd(), diff --git a/src/client/linux/handler/minidump_descriptor.cc b/src/client/linux/handler/minidump_descriptor.cc index 8c68bde2..c601d35f 100644 --- a/src/client/linux/handler/minidump_descriptor.cc +++ b/src/client/linux/handler/minidump_descriptor.cc @@ -44,7 +44,9 @@ MinidumpDescriptor::MinidumpDescriptor(const MinidumpDescriptor& descriptor) fd_(descriptor.fd_), directory_(descriptor.directory_), c_path_(NULL), - size_limit_(descriptor.size_limit_) { + size_limit_(descriptor.size_limit_), + microdump_build_fingerprint_(descriptor.microdump_build_fingerprint_), + microdump_product_info_(descriptor.microdump_product_info_) { // The copy constructor is not allowed to be called on a MinidumpDescriptor // with a valid path_, as getting its c_path_ would require the heap which // can cause problems in compromised environments. @@ -65,6 +67,8 @@ MinidumpDescriptor& MinidumpDescriptor::operator=( UpdatePath(); } size_limit_ = descriptor.size_limit_; + microdump_build_fingerprint_ = descriptor.microdump_build_fingerprint_; + microdump_product_info_ = descriptor.microdump_product_info_; return *this; } @@ -82,4 +86,15 @@ void MinidumpDescriptor::UpdatePath() { c_path_ = path_.c_str(); } +void MinidumpDescriptor::SetMicrodumpBuildFingerprint( + const char* build_fingerprint) { + assert(mode_ == kWriteMicrodumpToConsole); + microdump_build_fingerprint_ = build_fingerprint; +} + +void MinidumpDescriptor::SetMicrodumpProductInfo(const char* product_info) { + assert(mode_ == kWriteMicrodumpToConsole); + microdump_product_info_ = product_info; +} + } // namespace google_breakpad diff --git a/src/client/linux/handler/minidump_descriptor.h b/src/client/linux/handler/minidump_descriptor.h index ed656cee..3584c692 100644 --- a/src/client/linux/handler/minidump_descriptor.h +++ b/src/client/linux/handler/minidump_descriptor.h @@ -51,14 +51,18 @@ class MinidumpDescriptor { MinidumpDescriptor() : mode_(kUninitialized), fd_(-1), - size_limit_(-1) {} + size_limit_(-1), + microdump_build_fingerprint_(NULL), + microdump_product_info_(NULL) {} explicit MinidumpDescriptor(const string& directory) : mode_(kWriteMinidumpToFile), fd_(-1), directory_(directory), c_path_(NULL), - size_limit_(-1) { + size_limit_(-1), + microdump_build_fingerprint_(NULL), + microdump_product_info_(NULL) { assert(!directory.empty()); } @@ -66,14 +70,18 @@ class MinidumpDescriptor { : mode_(kWriteMinidumpToFd), fd_(fd), c_path_(NULL), - size_limit_(-1) { + size_limit_(-1), + microdump_build_fingerprint_(NULL), + microdump_product_info_(NULL) { assert(fd != -1); } explicit MinidumpDescriptor(const MicrodumpOnConsole&) : mode_(kWriteMicrodumpToConsole), fd_(-1), - size_limit_(-1) {} + size_limit_(-1), + microdump_build_fingerprint_(NULL), + microdump_product_info_(NULL) {} explicit MinidumpDescriptor(const MinidumpDescriptor& descriptor); MinidumpDescriptor& operator=(const MinidumpDescriptor& descriptor); @@ -99,6 +107,18 @@ class MinidumpDescriptor { off_t size_limit() const { return size_limit_; } void set_size_limit(off_t limit) { size_limit_ = limit; } + // TODO(primiano): make this and product info (below) just part of the + // microdump ctor once it is rolled stably into Chrome. ETA: June 2015. + void SetMicrodumpBuildFingerprint(const char* build_fingerprint); + const char* microdump_build_fingerprint() const { + return microdump_build_fingerprint_; + } + + void SetMicrodumpProductInfo(const char* product_info); + const char* microdump_product_info() const { + return microdump_product_info_; + } + private: enum DumpMode { kUninitialized = 0, @@ -115,13 +135,25 @@ class MinidumpDescriptor { // The directory where the minidump should be generated. string directory_; + // The full path to the generated minidump. string path_; + // The C string of |path_|. Precomputed so it can be access from a compromised // context. const char* c_path_; off_t size_limit_; + + // The product name/version and build fingerprint that should be appended to + // the dump (microdump only). Microdumps don't have the ability of appending + // extra metadata after the dump is generated (as opposite to minidumps + // MIME fields), therefore the product details must be provided upfront. + // The string pointers are supposed to be valid through all the lifetime of + // the process (read: the caller has to guarantee that they are stored in + // global static storage). + const char* microdump_build_fingerprint_; + const char* microdump_product_info_; }; } // namespace google_breakpad |