diff --git a/compiler-rt/lib/scudo/standalone/secondary.h b/compiler-rt/lib/scudo/standalone/secondary.h index d8c9f5bcfcaf6..9a8e53be388b7 100644 --- a/compiler-rt/lib/scudo/standalone/secondary.h +++ b/compiler-rt/lib/scudo/standalone/secondary.h @@ -391,10 +391,11 @@ template class MapAllocatorCache { return true; } if (O == Option::MaxCacheEntriesCount) { - const u32 MaxCount = static_cast(Value); - if (MaxCount > Config::getEntriesArraySize()) + if (Value < 0) return false; - atomic_store_relaxed(&MaxEntriesCount, MaxCount); + atomic_store_relaxed( + &MaxEntriesCount, + Min(static_cast(Value), Config::getEntriesArraySize())); return true; } if (O == Option::MaxCacheEntrySize) { diff --git a/compiler-rt/lib/scudo/standalone/tests/secondary_test.cpp b/compiler-rt/lib/scudo/standalone/tests/secondary_test.cpp index 8f0250e88ebf3..af69313214ea6 100644 --- a/compiler-rt/lib/scudo/standalone/tests/secondary_test.cpp +++ b/compiler-rt/lib/scudo/standalone/tests/secondary_test.cpp @@ -192,9 +192,9 @@ TEST_F(MapAllocatorTest, SecondaryIterate) { TEST_F(MapAllocatorTest, SecondaryOptions) { // Attempt to set a maximum number of entries higher than the array size. - EXPECT_FALSE( - Allocator->setOption(scudo::Option::MaxCacheEntriesCount, 4096U)); - // A negative number will be cast to a scudo::u32, and fail. + EXPECT_TRUE(Allocator->setOption(scudo::Option::MaxCacheEntriesCount, 4096U)); + + // Attempt to set an invalid (negative) number of entries EXPECT_FALSE(Allocator->setOption(scudo::Option::MaxCacheEntriesCount, -1)); if (Allocator->canCache(0U)) { // Various valid combinations.