mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-09 01:29:52 +00:00
Don't read non-readable address ranges during lsan pointer scanning
Summary: This specifically addresses the Mach-O zero page, which we cannot read from. Reviewers: kubamracek, samsonov, alekseyshl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D32044 llvm-svn: 300456
This commit is contained in:
parent
84577092ba
commit
7c6bf1cc9f
@ -108,7 +108,7 @@ void ProcessGlobalRegions(Frontier *frontier) {
|
||||
|
||||
for (const __sanitizer::LoadedModule::AddressRange &range :
|
||||
modules[i].ranges()) {
|
||||
if (range.executable) continue;
|
||||
if (range.executable || !range.readable) continue;
|
||||
|
||||
ScanGlobalRange(range.beg, range.end, frontier);
|
||||
}
|
||||
|
@ -284,9 +284,10 @@ void LoadedModule::clear() {
|
||||
}
|
||||
}
|
||||
|
||||
void LoadedModule::addAddressRange(uptr beg, uptr end, bool executable) {
|
||||
void LoadedModule::addAddressRange(uptr beg, uptr end, bool executable,
|
||||
bool readable) {
|
||||
void *mem = InternalAlloc(sizeof(AddressRange));
|
||||
AddressRange *r = new(mem) AddressRange(beg, end, executable);
|
||||
AddressRange *r = new(mem) AddressRange(beg, end, executable, readable);
|
||||
ranges_.push_back(r);
|
||||
if (executable && end > max_executable_address_)
|
||||
max_executable_address_ = end;
|
||||
|
@ -717,7 +717,7 @@ class LoadedModule {
|
||||
void set(const char *module_name, uptr base_address, ModuleArch arch,
|
||||
u8 uuid[kModuleUUIDSize], bool instrumented);
|
||||
void clear();
|
||||
void addAddressRange(uptr beg, uptr end, bool executable);
|
||||
void addAddressRange(uptr beg, uptr end, bool executable, bool readable);
|
||||
bool containsAddress(uptr address) const;
|
||||
|
||||
const char *full_name() const { return full_name_; }
|
||||
@ -732,9 +732,14 @@ class LoadedModule {
|
||||
uptr beg;
|
||||
uptr end;
|
||||
bool executable;
|
||||
bool readable;
|
||||
|
||||
AddressRange(uptr beg, uptr end, bool executable)
|
||||
: next(nullptr), beg(beg), end(end), executable(executable) {}
|
||||
AddressRange(uptr beg, uptr end, bool executable, bool readable)
|
||||
: next(nullptr),
|
||||
beg(beg),
|
||||
end(end),
|
||||
executable(executable),
|
||||
readable(readable) {}
|
||||
};
|
||||
|
||||
const IntrusiveList<AddressRange> &ranges() const { return ranges_; }
|
||||
|
@ -447,7 +447,9 @@ static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) {
|
||||
uptr cur_beg = info->dlpi_addr + phdr->p_vaddr;
|
||||
uptr cur_end = cur_beg + phdr->p_memsz;
|
||||
bool executable = phdr->p_flags & PF_X;
|
||||
cur_module.addAddressRange(cur_beg, cur_end, executable);
|
||||
bool readable = phdr->p_flags & PF_R;
|
||||
cur_module.addAddressRange(cur_beg, cur_end, executable,
|
||||
readable);
|
||||
}
|
||||
}
|
||||
data->modules->push_back(cur_module);
|
||||
|
@ -141,7 +141,8 @@ void MemoryMappingLayout::DumpListOfModules(
|
||||
uptr base_address = (i ? cur_beg : 0) - cur_offset;
|
||||
LoadedModule cur_module;
|
||||
cur_module.set(cur_name, base_address);
|
||||
cur_module.addAddressRange(cur_beg, cur_end, prot & kProtectionExecute);
|
||||
cur_module.addAddressRange(cur_beg, cur_end, prot & kProtectionExecute,
|
||||
prot & kProtectionRead);
|
||||
modules->push_back(cur_module);
|
||||
}
|
||||
}
|
||||
|
@ -262,7 +262,8 @@ void MemoryMappingLayout::DumpListOfModules(
|
||||
cur_module->set(cur_name, cur_beg, cur_arch, cur_uuid,
|
||||
current_instrumented_);
|
||||
}
|
||||
cur_module->addAddressRange(cur_beg, cur_end, prot & kProtectionExecute);
|
||||
cur_module->addAddressRange(cur_beg, cur_end, prot & kProtectionExecute,
|
||||
prot & kProtectionRead);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -553,7 +553,8 @@ void ListOfModules::init() {
|
||||
LoadedModule cur_module;
|
||||
cur_module.set(module_name, adjusted_base);
|
||||
// We add the whole module as one single address range.
|
||||
cur_module.addAddressRange(base_address, end_address, /*executable*/ true);
|
||||
cur_module.addAddressRange(base_address, end_address, /*executable*/ true,
|
||||
/*readable*/ true);
|
||||
modules_.push_back(cur_module);
|
||||
}
|
||||
UnmapOrDie(hmodules, modules_buffer_size);
|
||||
|
Loading…
Reference in New Issue
Block a user