From e30c94cb2ac458cabe62e258183aaf8a739ff07b Mon Sep 17 00:00:00 2001 From: Matthew Parkinson Date: Thu, 24 Jan 2019 09:37:39 +0000 Subject: [PATCH] Apply ModArray to Metaslab data Prevent bugs accessing outside the Slabs meta data. --- src/mem/alloc.h | 2 +- src/mem/metaslab.h | 9 +++++++++ src/mem/superslab.h | 25 +++++++++++++++++++------ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/mem/alloc.h b/src/mem/alloc.h index 2c424b7..3191708 100644 --- a/src/mem/alloc.h +++ b/src/mem/alloc.h @@ -755,7 +755,7 @@ namespace snmalloc if ((allow_reserve == NoReserve) && (super == nullptr)) return super; - super->init(public_state(), large_allocator.memory_provider); + super->init(public_state()); pagemap().set_slab(super); super_available.insert(super); return super; diff --git a/src/mem/metaslab.h b/src/mem/metaslab.h index c94de3e..d38ff02 100644 --- a/src/mem/metaslab.h +++ b/src/mem/metaslab.h @@ -91,6 +91,15 @@ namespace snmalloc head = (uint16_t)~0; } + void zero() + { + head = 0; + used = 0; + link = 0; + sizeclass = 0; + next = 0; + } + SlabLink* get_link(Slab* slab) { return (SlabLink*)((size_t)slab + link); diff --git a/src/mem/superslab.h b/src/mem/superslab.h index fc2e4e8..3f702a7 100644 --- a/src/mem/superslab.h +++ b/src/mem/superslab.h @@ -1,7 +1,7 @@ #pragma once #include "metaslab.h" - +#include "../ds/helpers.h" #include namespace snmalloc @@ -37,7 +37,7 @@ namespace snmalloc // short slab would be 6 + 1 = 7 uint16_t used; - Metaslab meta[SLAB_COUNT]; + ModArray meta; // Used size_t as results in better code in MSVC size_t slab_to_index(Slab* slab) @@ -74,8 +74,7 @@ namespace snmalloc return sizeclass <= h; } - template - void init(RemoteAllocator* alloc, MemoryProvider& memory_provider) + void init(RemoteAllocator* alloc) { allocator = alloc; @@ -91,10 +90,24 @@ namespace snmalloc { // If this wasn't previously Fresh, we need to zero some things. used = 0; - memory_provider.zero(meta, SLAB_COUNT * sizeof(Metaslab)); + for (auto i = 0; i < SLAB_COUNT; i++) + { + meta[i].zero(); + } } +#ifndef NDEBUG + auto curr = head; + for (auto i = 0; i < SLAB_COUNT - used - 1; i++) + { + curr = (curr + meta[curr].next + 1) & (SLAB_COUNT - 1); + } + assert (curr == 0); - meta[0].set_unused(); + for (auto i = 0; i < SLAB_COUNT; i++) + { + assert(meta[i].is_unused()); + } +#endif } }