diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2020-03-21 02:15:42 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2020-03-21 02:15:42 +0000 |
commit | 93772f58ed9a7b5fe4bc5c20a9aa76486734e241 (patch) | |
tree | 4d332b77cd1bcd8d692c083b29306cd5e6a1ef15 | |
parent | fa6b937ea569689e2067f58d8b4216d55890f7f9 (diff) | |
parent | 01727940b431ed42f6dbd79ac798f3b31b53050c (diff) | |
download | scudo-93772f58ed9a7b5fe4bc5c20a9aa76486734e241.tar.gz |
Snap for 6318629 from 01727940b431ed42f6dbd79ac798f3b31b53050c to rvc-d1-release
Change-Id: Iff03ce9886c620e4b3926fc7ba94ec40d5d16905
-rw-r--r-- | standalone/combined.h | 21 | ||||
-rw-r--r-- | standalone/tests/combined_test.cpp | 31 |
2 files changed, 25 insertions, 27 deletions
diff --git a/standalone/combined.h b/standalone/combined.h index 8456dc82d20..1aa93510d22 100644 --- a/standalone/combined.h +++ b/standalone/combined.h @@ -260,8 +260,8 @@ public: } DCHECK_LE(Size, NeededSize); - void *Block; - uptr ClassId; + void *Block = nullptr; + uptr ClassId = 0; uptr SecondaryBlockEnd; if (LIKELY(PrimaryT::canAllocate(NeededSize))) { ClassId = SizeClassMap::getClassIdBySize(NeededSize); @@ -273,20 +273,19 @@ public: // is the region being full. In that event, retry once using the // immediately larger class (except if the failing class was already the // largest). This will waste some memory but will allow the application to - // not fail. - if (SCUDO_ANDROID) { - if (UNLIKELY(!Block)) { - if (ClassId < SizeClassMap::LargestClassId) - Block = TSD->Cache.allocate(++ClassId); - } + // not fail. If dealing with the largest class, fallback to the Secondary. + if (UNLIKELY(!Block)) { + if (ClassId < SizeClassMap::LargestClassId) + Block = TSD->Cache.allocate(++ClassId); + else + ClassId = 0; } if (UnlockRequired) TSD->unlock(); - } else { - ClassId = 0; + } + if (UNLIKELY(ClassId == 0)) Block = Secondary.allocate(NeededSize, Alignment, &SecondaryBlockEnd, ZeroContents); - } if (UNLIKELY(!Block)) { if (Options.MayReturnNull) diff --git a/standalone/tests/combined_test.cpp b/standalone/tests/combined_test.cpp index ce1b2824788..a6f29a2610e 100644 --- a/standalone/tests/combined_test.cpp +++ b/standalone/tests/combined_test.cpp @@ -417,7 +417,7 @@ TEST(ScudoCombinedTest, ReleaseToOS) { Allocator->releaseToOS(); } -// Verify that when a region gets full, Android will still manage to +// Verify that when a region gets full, the allocator will still manage to // fulfill the allocation through a larger size class. TEST(ScudoCombinedTest, FullRegion) { using AllocatorT = scudo::Allocator<DeathConfig>; @@ -429,26 +429,25 @@ TEST(ScudoCombinedTest, FullRegion) { Deleter); Allocator->reset(); - const scudo::uptr Size = 1000U; - const scudo::uptr MaxNumberOfChunks = - (1U << DeathRegionSizeLog) / - DeathConfig::DeathSizeClassMap::getSizeByClassId(1U); - void *P; std::vector<void *> V; scudo::uptr FailedAllocationsCount = 0; - for (scudo::uptr I = 0; I <= MaxNumberOfChunks; I++) { - P = Allocator->allocate(Size, Origin); - if (!P) - FailedAllocationsCount++; - else - V.push_back(P); + for (scudo::uptr ClassId = 1U; + ClassId <= DeathConfig::DeathSizeClassMap::LargestClassId; ClassId++) { + const scudo::uptr Size = + DeathConfig::DeathSizeClassMap::getSizeByClassId(ClassId); + const scudo::uptr MaxNumberOfChunks = (1U << DeathRegionSizeLog) / Size; + void *P; + for (scudo::uptr I = 0; I <= MaxNumberOfChunks; I++) { + P = Allocator->allocate(Size - 64U, Origin); + if (!P) + FailedAllocationsCount++; + else + V.push_back(P); + } } while (!V.empty()) { Allocator->deallocate(V.back(), Origin); V.pop_back(); } - if (SCUDO_ANDROID) - EXPECT_EQ(FailedAllocationsCount, 0U); - else - EXPECT_GT(FailedAllocationsCount, 0U); + EXPECT_EQ(FailedAllocationsCount, 0U); } |