[compiler-rt] [scudo] Support no-preserve-all-regions mode (PR #85149)

Christopher Ferris via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 21 19:42:26 PDT 2024


================
@@ -601,6 +593,35 @@ template <typename Config> class SizeClassAllocator64 {
     return BlockSize > PageSize;
   }
 
+  void initRegion(RegionInfo *Region, uptr ClassId, MemMapT MemMap,
+                  bool EnableRandomOffset) REQUIRES(Region->MMLock) {
+    DCHECK(!Region->MemMapInfo.MemMap.isAllocated());
+    DCHECK(MemMap.isAllocated());
+
+    const uptr PageSize = getPageSizeCached();
+    const uptr RegionBase = MemMap.getBase();
+
+    Region->MemMapInfo.MemMap = MemMap;
+
+    u32 Seed;
+    const u64 Time = getMonotonicTimeFast();
+    if (!getRandom(reinterpret_cast<void *>(&Seed), sizeof(Seed)))
+      Seed = static_cast<u32>(Time ^ (RegionBase >> 12));
+
+    Region->RegionBeg = RegionBase;
+    if (EnableRandomOffset)
+      Region->RegionBeg += (getRandomModN(&Seed, 16) + 1) * PageSize;
----------------
cferris1000 wrote:

Given that Seed is only used if EnableRandomOffset is set, should all of the seed generation also be moved under this check?

Assuming you want to keep the seed generation in this function, although it happens outside, it should probably be gated by a EnableRandomOffset check too.

https://github.com/llvm/llvm-project/pull/85149


More information about the llvm-commits mailing list