Skip to content

Commit

Permalink
Fix regression in FreeListRef where no memory was allocated for the r…
Browse files Browse the repository at this point in the history
…ef count. Fixes #1432.

Commit 6be5471 switched FreeListRef to use FreeListObjectAlloc underneath, but didn't accound for the extra memory that is needed to store the reference count directly after the object payload. The possible implications of this are memory corruption and memory leaks, although with the predefined allocator setip, this will only happen to types with a POT size or slightly less.

This commit adds an "EXTRA" template type parameter to FreeListObjectAlloc that is used to determine the additional amount of allocated memory, which is set to "int" in the case of FreeListRef.
  • Loading branch information
s-ludwig committed Feb 19, 2016
1 parent 72f316b commit d78a9ce
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions source/vibe/utils/memory.d
Expand Up @@ -611,10 +611,10 @@ nothrow:
}
}

struct FreeListObjectAlloc(T, bool USE_GC = true, bool INIT = true)
struct FreeListObjectAlloc(T, bool USE_GC = true, bool INIT = true, EXTRA = void)
{
enum ElemSize = AllocSize!T;
enum ElemSlotSize = max(AllocSize!T, Slot.sizeof);
enum ElemSlotSize = max(AllocSize!T + AllocSize!EXTRA, Slot.sizeof);

static if( is(T == class) ){
alias TR = T;
Expand Down Expand Up @@ -675,7 +675,7 @@ template AllocSize(T)

struct FreeListRef(T, bool INIT = true)
{
alias ObjAlloc = FreeListObjectAlloc!(T, true, INIT);
alias ObjAlloc = FreeListObjectAlloc!(T, true, INIT, int);
enum ElemSize = AllocSize!T;

static if( is(T == class) ){
Expand Down

0 comments on commit d78a9ce

Please sign in to comment.