diff options
Diffstat (limited to 'lib/lsan/lsan_common_mac.cc')
-rw-r--r-- | lib/lsan/lsan_common_mac.cc | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/lsan/lsan_common_mac.cc b/lib/lsan/lsan_common_mac.cc index f87c6b7e0..c0fa36fd9 100644 --- a/lib/lsan/lsan_common_mac.cc +++ b/lib/lsan/lsan_common_mac.cc @@ -92,8 +92,15 @@ LoadedModule *GetLinker() { return nullptr; } // required on Darwin. void InitializePlatformSpecificModules() {} +// Sections which may contain global variables +static const char *kGlobalVarSecNames[] = { + "__DATA", "__bss", "__common", "__data", + "__objc_data", "__objc_opt_rw", "__objc_opt_ptrs"}; + // Scans global variables for heap pointers. void ProcessGlobalRegions(Frontier *frontier) { + for (auto name : kGlobalVarSecNames) CHECK(ARRAY_SIZE(name) < kMaxSegName); + MemoryMappingLayout memory_mapping(false); InternalMmapVector<LoadedModule> modules(/*initial_capacity*/ 128); memory_mapping.DumpListOfModules(&modules); @@ -104,10 +111,10 @@ void ProcessGlobalRegions(Frontier *frontier) { for (const __sanitizer::LoadedModule::AddressRange &range : modules[i].ranges()) { - // Sections storing global variables are writable and non-executable - if (range.executable || !range.writable) continue; - - ScanGlobalRange(range.beg, range.end, frontier); + for (auto name : kGlobalVarSecNames) { + if (!internal_strcmp(range.name, name)) + ScanGlobalRange(range.beg, range.end, frontier); + } } } } |