diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h index 52958de6de0e..267903ebca32 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h @@ -458,7 +458,7 @@ class InternalMmapVectorNoCtor { CHECK_LE(size_, capacity_); if (size_ == capacity_) { uptr new_capacity = RoundUpToPowerOfTwo(size_ + 1); - Resize(new_capacity); + Realloc(new_capacity); } internal_memcpy(&data_[size_++], &element, sizeof(T)); } @@ -483,12 +483,13 @@ class InternalMmapVectorNoCtor { return capacity_; } void reserve(uptr new_size) { - if (new_size >= size()) return; - Resize(new_size); + // Never downsize internal buffer. + if (new_size > capacity()) + Realloc(new_size); } void resize(uptr new_size) { - Resize(new_size); if (new_size > size_) { + reserve(new_size); internal_memset(&data_[size_], 0, sizeof(T) * (new_size - size_)); } size_ = new_size; @@ -517,7 +518,7 @@ class InternalMmapVectorNoCtor { } private: - void Resize(uptr new_capacity) { + void Realloc(uptr new_capacity) { CHECK_GT(new_capacity, 0); CHECK_LE(size_, new_capacity); T *new_data = (T *)MmapOrDie(new_capacity * sizeof(T), diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc b/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc index da761bef689c..02fecddbcc60 100644 --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc @@ -88,6 +88,29 @@ TEST(SanitizerCommon, MmapAlignedOrDieOnFatalError) { } } +TEST(SanitizerCommon, InternalMmapVectorReize) { + InternalMmapVector v; + CHECK_EQ(0U, v.size()); + CHECK_GE(v.capacity(), v.size()); + + v.reserve(1000); + CHECK_EQ(0U, v.size()); + CHECK_GE(v.capacity(), 1000U); + + v.resize(10000); + CHECK_EQ(10000U, v.size()); + CHECK_GE(v.capacity(), v.size()); + uptr cap = v.capacity(); + + v.resize(100); + CHECK_EQ(100U, v.size()); + CHECK_EQ(v.capacity(), cap); + + v.reserve(10); + CHECK_EQ(100U, v.size()); + CHECK_EQ(v.capacity(), cap); +} + TEST(SanitizerCommon, InternalMmapVector) { InternalMmapVector vector; for (uptr i = 0; i < 100; i++) {