aboutsummaryrefslogtreecommitdiff
path: root/src/google_breakpad
diff options
context:
space:
mode:
Diffstat (limited to 'src/google_breakpad')
-rw-r--r--src/google_breakpad/processor/basic_source_line_resolver.h1
-rw-r--r--src/google_breakpad/processor/fast_source_line_resolver.h1
-rw-r--r--src/google_breakpad/processor/process_state.h6
-rw-r--r--src/google_breakpad/processor/source_line_resolver_base.h14
-rw-r--r--src/google_breakpad/processor/source_line_resolver_interface.h10
-rw-r--r--src/google_breakpad/processor/stack_frame_symbolizer.h5
-rw-r--r--src/google_breakpad/processor/stackwalker.h9
-rw-r--r--src/google_breakpad/processor/symbol_supplier.h3
8 files changed, 40 insertions, 9 deletions
diff --git a/src/google_breakpad/processor/basic_source_line_resolver.h b/src/google_breakpad/processor/basic_source_line_resolver.h
index 8bda5784..c1946ca4 100644
--- a/src/google_breakpad/processor/basic_source_line_resolver.h
+++ b/src/google_breakpad/processor/basic_source_line_resolver.h
@@ -59,6 +59,7 @@ class BasicSourceLineResolver : public SourceLineResolverBase {
using SourceLineResolverBase::ShouldDeleteMemoryBufferAfterLoadModule;
using SourceLineResolverBase::UnloadModule;
using SourceLineResolverBase::HasModule;
+ using SourceLineResolverBase::IsModuleCorrupt;
using SourceLineResolverBase::FillSourceLineInfo;
using SourceLineResolverBase::FindWindowsFrameInfo;
using SourceLineResolverBase::FindCFIFrameInfo;
diff --git a/src/google_breakpad/processor/fast_source_line_resolver.h b/src/google_breakpad/processor/fast_source_line_resolver.h
index 60f6dfce..fdf91077 100644
--- a/src/google_breakpad/processor/fast_source_line_resolver.h
+++ b/src/google_breakpad/processor/fast_source_line_resolver.h
@@ -63,6 +63,7 @@ class FastSourceLineResolver : public SourceLineResolverBase {
using SourceLineResolverBase::FindCFIFrameInfo;
using SourceLineResolverBase::FindWindowsFrameInfo;
using SourceLineResolverBase::HasModule;
+ using SourceLineResolverBase::IsModuleCorrupt;
using SourceLineResolverBase::LoadModule;
using SourceLineResolverBase::LoadModuleUsingMapBuffer;
using SourceLineResolverBase::LoadModuleUsingMemoryBuffer;
diff --git a/src/google_breakpad/processor/process_state.h b/src/google_breakpad/processor/process_state.h
index d234ebbf..2a306f6f 100644
--- a/src/google_breakpad/processor/process_state.h
+++ b/src/google_breakpad/processor/process_state.h
@@ -109,6 +109,9 @@ class ProcessState {
const vector<const CodeModule*>* modules_without_symbols() const {
return &modules_without_symbols_;
}
+ const vector<const CodeModule*>* modules_with_corrupt_symbols() const {
+ return &modules_with_corrupt_symbols_;
+ }
ExploitabilityRating exploitability() const { return exploitability_; }
private:
@@ -164,6 +167,9 @@ class ProcessState {
// The modules that didn't have symbols when the report was processed.
vector<const CodeModule*> modules_without_symbols_;
+ // The modules that had corrupt symbols when the report was processed.
+ vector<const CodeModule*> modules_with_corrupt_symbols_;
+
// The exploitability rating as determined by the exploitability
// engine. When the exploitability engine is not enabled this
// defaults to EXPLOITABILITY_NONE.
diff --git a/src/google_breakpad/processor/source_line_resolver_base.h b/src/google_breakpad/processor/source_line_resolver_base.h
index efa76e7e..c720b0c3 100644
--- a/src/google_breakpad/processor/source_line_resolver_base.h
+++ b/src/google_breakpad/processor/source_line_resolver_base.h
@@ -42,6 +42,7 @@
#define GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_BASE_H__
#include <map>
+#include <set>
#include <string>
#include "google_breakpad/processor/source_line_resolver_interface.h"
@@ -49,6 +50,7 @@
namespace google_breakpad {
using std::map;
+using std::set;
// Forward declaration.
// ModuleFactory is a simple factory interface for creating a Module instance
@@ -62,7 +64,9 @@ class SourceLineResolverBase : public SourceLineResolverInterface {
// LoadMap() method.
// Place dynamically allocated heap buffer in symbol_data. Caller has the
// ownership of the buffer, and should call delete [] to free the buffer.
- static bool ReadSymbolFile(char **symbol_data, const string &file_name);
+ static bool ReadSymbolFile(const string &file_name,
+ char **symbol_data,
+ size_t *symbol_data_size);
protected:
// Users are not allowed create SourceLineResolverBase instance directly.
@@ -74,10 +78,12 @@ class SourceLineResolverBase : public SourceLineResolverInterface {
virtual bool LoadModuleUsingMapBuffer(const CodeModule *module,
const string &map_buffer);
virtual bool LoadModuleUsingMemoryBuffer(const CodeModule *module,
- char *memory_buffer);
+ char *memory_buffer,
+ size_t memory_buffer_size);
virtual bool ShouldDeleteMemoryBufferAfterLoadModule();
virtual void UnloadModule(const CodeModule *module);
virtual bool HasModule(const CodeModule *module);
+ virtual bool IsModuleCorrupt(const CodeModule *module);
virtual void FillSourceLineInfo(StackFrame *frame);
virtual WindowsFrameInfo *FindWindowsFrameInfo(const StackFrame *frame);
virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame);
@@ -97,6 +103,10 @@ class SourceLineResolverBase : public SourceLineResolverInterface {
typedef map<string, Module*, CompareString> ModuleMap;
ModuleMap *modules_;
+ // The loaded modules that were detecting to be corrupt during load.
+ typedef set<string, CompareString> ModuleSet;
+ ModuleSet *corrupt_modules_;
+
// All of heap-allocated buffers that are owned locally by resolver.
typedef std::map<string, char*, CompareString> MemoryMap;
MemoryMap *memory_buffers_;
diff --git a/src/google_breakpad/processor/source_line_resolver_interface.h b/src/google_breakpad/processor/source_line_resolver_interface.h
index 7b69b0d3..a694bf2e 100644
--- a/src/google_breakpad/processor/source_line_resolver_interface.h
+++ b/src/google_breakpad/processor/source_line_resolver_interface.h
@@ -64,12 +64,15 @@ class SourceLineResolverInterface {
virtual bool LoadModuleUsingMapBuffer(const CodeModule *module,
const string &map_buffer) = 0;
- // Add an interface to load symbol using C-String data insteading string.
+ // Add an interface to load symbol using C-String data instead of string.
// This is useful in the optimization design for avoiding unnecessary copying
// of symbol data, in order to improve memory efficiency.
// LoadModuleUsingMemoryBuffer() does NOT take ownership of memory_buffer.
+ // LoadModuleUsingMemoryBuffer() null terminates the passed in buffer, if
+ // the last character is not a null terminator.
virtual bool LoadModuleUsingMemoryBuffer(const CodeModule *module,
- char *memory_buffer) = 0;
+ char *memory_buffer,
+ size_t memory_buffer_size) = 0;
// Return true if the memory buffer should be deleted immediately after
// LoadModuleUsingMemoryBuffer(). Return false if the memory buffer has to be
@@ -83,6 +86,9 @@ class SourceLineResolverInterface {
// Returns true if the module has been loaded.
virtual bool HasModule(const CodeModule *module) = 0;
+ // Returns true if the module has been loaded and it is corrupt.
+ virtual bool IsModuleCorrupt(const CodeModule *module) = 0;
+
// Fills in the function_base, function_name, source_file_name,
// and source_line fields of the StackFrame. The instruction and
// module_name fields must already be filled in.
diff --git a/src/google_breakpad/processor/stack_frame_symbolizer.h b/src/google_breakpad/processor/stack_frame_symbolizer.h
index 6f89167e..074907cb 100644
--- a/src/google_breakpad/processor/stack_frame_symbolizer.h
+++ b/src/google_breakpad/processor/stack_frame_symbolizer.h
@@ -62,7 +62,10 @@ class StackFrameSymbolizer {
kError,
// This indicates error for which stack walk should be interrupted
// and retried in future.
- kInterrupt
+ kInterrupt,
+ // Symbol data was found and loaded in resolver however some corruptions
+ // were detected.
+ kWarningCorruptSymbols,
};
StackFrameSymbolizer(SymbolSupplier* supplier,
diff --git a/src/google_breakpad/processor/stackwalker.h b/src/google_breakpad/processor/stackwalker.h
index 11039d6e..9229237c 100644
--- a/src/google_breakpad/processor/stackwalker.h
+++ b/src/google_breakpad/processor/stackwalker.h
@@ -68,15 +68,18 @@ class Stackwalker {
// GetCallerFrame. The frames are further processed to fill all available
// data. Returns true if the stackwalk completed, or false if it was
// interrupted by SymbolSupplier::GetSymbolFile().
- // Upon return, modules_without_symbols will be populated with pointers to
+ // Upon return, |modules_without_symbols| will be populated with pointers to
// the code modules (CodeModule*) that DON'T have symbols.
- // modules_without_symbols DOES NOT take ownership of the code modules.
+ // |modules_with_corrupt_symbols| will be populated with pointers to the
+ // modules which have corrupt symbols. |modules_without_symbols| and
+ // |modules_with_corrupt_symbols| DO NOT take ownership of the code modules.
// The lifetime of these code modules is the same as the lifetime of the
// CodeModules passed to the StackWalker constructor (which currently
// happens to be the lifetime of the Breakpad's ProcessingState object).
// There is a check for duplicate modules so no duplicates are expected.
bool Walk(CallStack* stack,
- vector<const CodeModule*>* modules_without_symbols);
+ vector<const CodeModule*>* modules_without_symbols,
+ vector<const CodeModule*>* modules_with_corrupt_symbols);
// Returns a new concrete subclass suitable for the CPU that a stack was
// generated on, according to the CPU type indicated by the context
diff --git a/src/google_breakpad/processor/symbol_supplier.h b/src/google_breakpad/processor/symbol_supplier.h
index dccab509..a042081f 100644
--- a/src/google_breakpad/processor/symbol_supplier.h
+++ b/src/google_breakpad/processor/symbol_supplier.h
@@ -87,7 +87,8 @@ class SymbolSupplier {
virtual SymbolResult GetCStringSymbolData(const CodeModule *module,
const SystemInfo *system_info,
string *symbol_file,
- char **symbol_data) = 0;
+ char **symbol_data,
+ size_t *symbol_data_size) = 0;
// Frees the data buffer allocated for the module in GetCStringSymbolData.
virtual void FreeSymbolData(const CodeModule *module) = 0;