[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
This commit is contained in:
parent
490500a7e8
commit
fd3241528d
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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_;
|
||||
|
|
|
|||
Loading…
Reference in New Issue