From cecd64012db013331ff1071254ab543dcdf327bd Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 26 Apr 2016 17:10:04 -0700 Subject: [PATCH] Silently ignore duplicate heap entries Vendor blobs on ryu mprotect heap pages, causing a single chunk mapping to appear as multiple mappings. The heap iterator has to expand the requested range to cover the beginning of the chunk to find the chunk metadata, which will lead to duplicate identical allocations being reported from iterating over each of the split mappings. Silently ignore identical allocations, and only warn on non-identical allocations that overlap. Bug: 28269332 Change-Id: Ied2ab9270f65d00a887c7ce1a93fbf0617d69be0 --- libmemunreachable/HeapWalker.cpp | 12 +++++++----- libmemunreachable/HeapWalker.h | 6 ++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libmemunreachable/HeapWalker.cpp b/libmemunreachable/HeapWalker.cpp index faa6fe2b2..62366f2ef 100644 --- a/libmemunreachable/HeapWalker.cpp +++ b/libmemunreachable/HeapWalker.cpp @@ -41,11 +41,13 @@ bool HeapWalker::Allocation(uintptr_t begin, uintptr_t end) { return true; } else { Range overlap = inserted.first->first; - ALOGE("range %p-%p overlaps with existing range %p-%p", - reinterpret_cast(begin), - reinterpret_cast(end), - reinterpret_cast(overlap.begin), - reinterpret_cast(overlap.end)); + if (overlap != range) { + ALOGE("range %p-%p overlaps with existing range %p-%p", + reinterpret_cast(begin), + reinterpret_cast(end), + reinterpret_cast(overlap.begin), + reinterpret_cast(overlap.end)); + } return false; } } diff --git a/libmemunreachable/HeapWalker.h b/libmemunreachable/HeapWalker.h index 140f3eaa0..3c1b513c1 100644 --- a/libmemunreachable/HeapWalker.h +++ b/libmemunreachable/HeapWalker.h @@ -31,6 +31,12 @@ struct Range { uintptr_t end; size_t size() const { return end - begin; }; + bool operator==(const Range& other) const { + return this->begin == other.begin && this->end == other.end; + } + bool operator!=(const Range& other) const { + return !(*this == other); + } }; // Comparator for Ranges that returns equivalence for overlapping ranges