Add new flag to allow granular control over the use of objdump.

This adds a new flag `enable_objdump_for_exploitability_` to the
MinidumpProcessor, which allows enabling objdump separately for crash
address fixups and for exploitability analysis, as the performance cost
of the exploitability analysis is significantly higher.

Change-Id: I667ffdce7cc0a970793f91413c3d2e3af93f4247
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/4507067
Reviewed-by: Ivan Penkov <ivanpe@google.com>
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
This commit is contained in:
Mark Brand 2023-05-09 14:31:56 +02:00 committed by Ivan Penkov
parent f4a3b346f3
commit 463ae7cd60
3 changed files with 21 additions and 6 deletions

View file

@ -126,8 +126,18 @@ class MinidumpProcessor {
// does not exist or cannot be determined. // does not exist or cannot be determined.
static string GetAssertion(Minidump* dump); static string GetAssertion(Minidump* dump);
// Sets the flag to enable/disable use of objdump during normal crash
// processing. This is independent from the flag for use of objdump during
// exploitability analysis.
void set_enable_objdump(bool enabled) { enable_objdump_ = enabled; } void set_enable_objdump(bool enabled) { enable_objdump_ = enabled; }
// Sets the flag to enable/disable use of objdump during exploitability
// analysis. This is independent from the flag for use of objdump during
// normal crash processing.
void set_enable_objdump_for_exploitability(bool enabled) {
enable_objdump_for_exploitability_ = enabled;
}
private: private:
StackFrameSymbolizer* frame_symbolizer_; StackFrameSymbolizer* frame_symbolizer_;
// Indicate whether resolver_helper_ is owned by this instance. // Indicate whether resolver_helper_ is owned by this instance.
@ -138,9 +148,15 @@ class MinidumpProcessor {
// memory corruption issue. // memory corruption issue.
bool enable_exploitability_; bool enable_exploitability_;
// This flag permits the exploitability scanner to shell out to objdump // This flag permits the processor to shell out to objdump for purposes of
// for purposes of disassembly. // disassembly during normal crash processing, but not during exploitability
// analysis.
bool enable_objdump_; bool enable_objdump_;
// This flag permits the exploitability scanner to shell out to objdump for
// purposes of disassembly. This results in significantly more overhead than
// the enable_objdump_ flag.
bool enable_objdump_for_exploitability_;
}; };
} // namespace google_breakpad } // namespace google_breakpad

View file

@ -84,7 +84,7 @@ ExploitabilityFor(const string& filename) {
SimpleSymbolSupplier supplier(TestDataDir() + "/symbols"); SimpleSymbolSupplier supplier(TestDataDir() + "/symbols");
BasicSourceLineResolver resolver; BasicSourceLineResolver resolver;
MinidumpProcessor processor(&supplier, &resolver, true); MinidumpProcessor processor(&supplier, &resolver, true);
processor.set_enable_objdump(true); processor.set_enable_objdump_for_exploitability(true);
ProcessState state; ProcessState state;
string minidump_file = TestDataDir() + "/" + filename; string minidump_file = TestDataDir() + "/" + filename;

View file

@ -375,9 +375,8 @@ ProcessResult MinidumpProcessor::Process(
// rating. // rating.
if (enable_exploitability_) { if (enable_exploitability_) {
scoped_ptr<Exploitability> exploitability( scoped_ptr<Exploitability> exploitability(
Exploitability::ExploitabilityForPlatform(dump, Exploitability::ExploitabilityForPlatform(
process_state, dump, process_state, enable_objdump_for_exploitability_));
enable_objdump_));
// The engine will be null if the platform is not supported // The engine will be null if the platform is not supported
if (exploitability != NULL) { if (exploitability != NULL) {
process_state->exploitability_ = exploitability->CheckExploitability(); process_state->exploitability_ = exploitability->CheckExploitability();