[scudo] Test ScudoReleaseTest.BufferPool with a buffer pool allocated on the heap

The previous code resulted in 252 KiB being allocated on the stack,
which caused a stack overflow on Fuchsia.

Reviewed By: Chia-hungDuan

Differential Revision: https://reviews.llvm.org/D146229

GitOrigin-RevId: 248ee65ac647ac53a415aea1cf314e82f5a30075
Change-Id: I1cf3a538acf9d82ff1f162834f131a2f23ef1b35
diff --git a/standalone/tests/release_test.cpp b/standalone/tests/release_test.cpp
index 173928e..1fc4284 100644
--- a/standalone/tests/release_test.cpp
+++ b/standalone/tests/release_test.cpp
@@ -566,20 +566,25 @@
 TEST(ScudoReleaseTest, BufferPool) {
   constexpr scudo::uptr StaticBufferCount = SCUDO_WORDSIZE - 1;
   constexpr scudo::uptr StaticBufferSize = 512U;
-  scudo::BufferPool<StaticBufferCount, StaticBufferSize> Pool;
+
+  // Allocate the buffer pool on the heap because it is quite large (slightly
+  // more than StaticBufferCount * StaticBufferSize * sizeof(uptr)) and it may
+  // not fit in the stack on some platforms.
+  using BufferPool = scudo::BufferPool<StaticBufferCount, StaticBufferSize>;
+  std::unique_ptr<BufferPool> Pool(new BufferPool());
 
   std::vector<std::pair<scudo::uptr *, scudo::uptr>> Buffers;
   for (scudo::uptr I = 0; I < StaticBufferCount; ++I) {
-    scudo::uptr *P = Pool.getBuffer(StaticBufferSize);
-    EXPECT_TRUE(Pool.isStaticBufferTestOnly(P, StaticBufferSize));
+    scudo::uptr *P = Pool->getBuffer(StaticBufferSize);
+    EXPECT_TRUE(Pool->isStaticBufferTestOnly(P, StaticBufferSize));
     Buffers.emplace_back(P, StaticBufferSize);
   }
 
   // The static buffer is supposed to be used up.
-  scudo::uptr *P = Pool.getBuffer(StaticBufferSize);
-  EXPECT_FALSE(Pool.isStaticBufferTestOnly(P, StaticBufferSize));
+  scudo::uptr *P = Pool->getBuffer(StaticBufferSize);
+  EXPECT_FALSE(Pool->isStaticBufferTestOnly(P, StaticBufferSize));
 
-  Pool.releaseBuffer(P, StaticBufferSize);
+  Pool->releaseBuffer(P, StaticBufferSize);
   for (auto &Buffer : Buffers)
-    Pool.releaseBuffer(Buffer.first, Buffer.second);
+    Pool->releaseBuffer(Buffer.first, Buffer.second);
 }