aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/handler
diff options
context:
space:
mode:
authorprimiano@chromium.org <primiano@chromium.org>2015-05-15 08:43:01 +0000
committerprimiano@chromium.org <primiano@chromium.org>2015-05-15 08:43:01 +0000
commit90cbb27528a69b9fb19d9f8a01f8fabc16e4a687 (patch)
treecde355f082391d9ba0b76d3cb89e2beb9c782576 /src/client/linux/handler
parentSwitch code review server to codereview.chromium.org. (diff)
downloadbreakpad-90cbb27528a69b9fb19d9f8a01f8fabc16e4a687.tar.xz
[microdump] Add build fingerprint and product info metadata.
This is to add build fingerprint and product name/version to microdumps. Conversely to what happens in the case of minidumps with MIME fields, due to the nature of minidumps, extra metadata cannot be reliably injected after the dump is completed. This CL adds the plumbing to inject two optional fields plus the corresponding tests. BUG=chromium:410294 R=thestig@chromium.org Review URL: https://codereview.chromium.org/1125153008 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1456 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/linux/handler')
-rw-r--r--src/client/linux/handler/exception_handler.cc11
-rw-r--r--src/client/linux/handler/minidump_descriptor.cc17
-rw-r--r--src/client/linux/handler/minidump_descriptor.h40
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