diff options
| author | Timur Iskhodzhanov <timurrrr@google.com> | 2015-03-26 07:14:29 +0000 |
|---|---|---|
| committer | Timur Iskhodzhanov <timurrrr@google.com> | 2015-03-26 07:14:29 +0000 |
| commit | fd3241528dde43cfcd93d60760e3861380f9ef69 (patch) | |
| tree | 6482ebacbc483401e0b593b3d2379e2f78047919 /compiler-rt/lib | |
| parent | 490500a7e851e5dbf77587818daf9714c71a8a70 (diff) | |
| download | bcm5719-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.h | 1 | ||||
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc | 11 |
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_; |

