summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib
diff options
context:
space:
mode:
authorTimur Iskhodzhanov <timurrrr@google.com>2015-03-26 07:14:29 +0000
committerTimur Iskhodzhanov <timurrrr@google.com>2015-03-26 07:14:29 +0000
commitfd3241528dde43cfcd93d60760e3861380f9ef69 (patch)
tree6482ebacbc483401e0b593b3d2379e2f78047919 /compiler-rt/lib
parent490500a7e851e5dbf77587818daf9714c71a8a70 (diff)
downloadbcm5719-llvm-fd3241528dde43cfcd93d60760e3861380f9ef69.tar.gz
bcm5719-llvm-fd3241528dde43cfcd93d60760e3861380f9ef69.zip
[Sanitizer] Plug a leak in POSIXSymbolizer::FindModuleForAddress
It was happening when we looked up a PC for a module that was dlopen'ed/dlclose'd after the last time we fetched the list of modules Reviewed at http://reviews.llvm.org/D8618 llvm-svn: 233257
Diffstat (limited to 'compiler-rt/lib')
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common.h1
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc11
2 files changed, 6 insertions, 6 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h
index a4a004c3b0e..0dfa8159345 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h
@@ -548,6 +548,7 @@ uptr InternalBinarySearch(const Container &v, uptr first, uptr last,
// executable or a shared object).
class LoadedModule {
public:
+ LoadedModule() : full_name_(nullptr), base_address_(0) {}
LoadedModule(const char *module_name, uptr base_address);
void clear();
void addAddressRange(uptr beg, uptr end, bool executable);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
index 78c189497a5..189b0abd86d 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
@@ -352,7 +352,7 @@ class InternalSymbolizer : public SymbolizerTool {
class POSIXSymbolizer : public Symbolizer {
public:
explicit POSIXSymbolizer(IntrusiveList<SymbolizerTool> tools)
- : Symbolizer(tools) {}
+ : Symbolizer(tools), n_modules_(0), modules_fresh_(false) {}
private:
const char *PlatformDemangle(const char *name) override {
@@ -368,10 +368,9 @@ class POSIXSymbolizer : public Symbolizer {
LoadedModule *FindModuleForAddress(uptr address) {
bool modules_were_reloaded = false;
- if (modules_ == 0 || !modules_fresh_) {
- modules_ = (LoadedModule*)(symbolizer_allocator_.Allocate(
- kMaxNumberOfModuleContexts * sizeof(LoadedModule)));
- CHECK(modules_);
+ if (!modules_fresh_) {
+ for (uptr i = 0; i < n_modules_; i++)
+ modules_[i].clear();
n_modules_ = GetListOfModules(modules_, kMaxNumberOfModuleContexts,
/* filter */ 0);
CHECK_GT(n_modules_, 0);
@@ -408,7 +407,7 @@ class POSIXSymbolizer : public Symbolizer {
// 16K loaded modules should be enough for everyone.
static const uptr kMaxNumberOfModuleContexts = 1 << 14;
- LoadedModule *modules_; // Array of module descriptions is leaked.
+ LoadedModule modules_[kMaxNumberOfModuleContexts];
uptr n_modules_;
// If stale, need to reload the modules before looking up addresses.
bool modules_fresh_;
OpenPOWER on IntegriCloud