1
0
mirror of https://github.com/wolfpld/tracy.git synced 2025-03-20 07:40:02 +08:00

had accidentally removed the check the the address isn't past the mapping's end address

This commit is contained in:
Benoit Jacob 2020-11-19 22:18:12 -05:00
parent 76a7428afd
commit 33b08b3160

View File

@ -2979,22 +2979,21 @@ std::vector<MappingInfo> ParseMappings()
// the address isn't in `mappings`. // the address isn't in `mappings`.
MappingInfo* LookUpMapping(std::vector<MappingInfo>& mappings, uintptr_t address) MappingInfo* LookUpMapping(std::vector<MappingInfo>& mappings, uintptr_t address)
{ {
// Find the first mapping containing the requested address.
// We assume mappings to be sorted by address, as /proc/self/maps seems to be. // We assume mappings to be sorted by address, as /proc/self/maps seems to be.
// Construct a MappingInfo just for the purpose of using std::lower_bound. // Construct a MappingInfo just for the purpose of using std::lower_bound.
// (It's an abuse of MappingInfo since this address range is not necessarily // (It's an abuse of MappingInfo since this address range is not necessarily
// one mapping). // one mapping).
MappingInfo address_range; MappingInfo needle;
address_range.start_address = address; needle.start_address = address;
address_range.end_address = address; needle.end_address = address;
// Comparison function for std::lower_bound. Returns true if all addresses in `m1` // Comparison function for std::lower_bound. Returns true if all addresses in `m1`
// are lower than all addresses in `m2`. // are lower than all addresses in `m2`.
auto Compare = []( const MappingInfo& m1, const MappingInfo& m2 ) { auto Compare = []( const MappingInfo& m1, const MappingInfo& m2 ) {
// '<=' because the address ranges are half-open intervals, [start, end). // '<=' because the address ranges are half-open intervals, [start, end).
return m1.end_address <= m2.start_address; return m1.end_address <= m2.start_address;
}; };
auto iter = std::lower_bound( mappings.begin(), mappings.end(), address_range, Compare ); auto iter = std::lower_bound( mappings.begin(), mappings.end(), needle, Compare );
if( iter == mappings.end() ) { if( iter == mappings.end() || iter->end_address <= address) {
return nullptr; return nullptr;
} }
return &*iter; return &*iter;