From 01bf510a288ebbda179fb5c0ef7d14a03ee05787 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Sat, 24 Feb 2018 04:35:49 +0100 Subject: [PATCH] util-memory: Use standard alloc/free and fix incorrect aligned length The custom allocator occasionally returned memory that was aligned, but did not have enough space to store the actual size due to a calculation error in the size. This resulted in situations where allocating 1022 bytes would give you a writable buffer of only 1020 bytes or less, or also known as writing into unknown memory, possibly even the heap. This is now fixed by doubling the padding used. Additionally it will now default to using standard allocators, which should work better and rely on the Compiler. --- source/util-memory.cpp | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/source/util-memory.cpp b/source/util-memory.cpp index cbe70241..c97efc9b 100644 --- a/source/util-memory.cpp +++ b/source/util-memory.cpp @@ -19,25 +19,50 @@ #include "util-memory.h" #include +#define USE_STD_ALLOC_FREE void* util::malloc_aligned(size_t align, size_t size) { +#ifdef USE_STD_ALLOC_FREE +#if defined(_MSC_VER) +#ifdef DEBUG + return _aligned_malloc_dbg(size, align); +#else + return _aligned_malloc(size, align); +#endif +#else + return aligned_malloc(align, size); +#endif +#else // Ensure that we have space for the pointer and the data. - size_t asize = aligned_offset(align, size + sizeof(void*)); + size_t asize = aligned_offset(align, size + (sizeof(void*) * 2)); // Allocate memory and store integer representation of pointer. void* ptr = malloc(asize); // Calculate actual aligned position - intptr_t ptr_off = aligned_offset(align, reinterpret_cast(ptr)+sizeof(void*)); + intptr_t ptr_off = aligned_offset(align, reinterpret_cast(ptr) + sizeof(void*)); // Store actual pointer at ptr_off - sizeof(void*). *reinterpret_cast(ptr_off - sizeof(void*)) = reinterpret_cast(ptr); // Return aligned pointer return reinterpret_cast(ptr_off); +#endif } void util::free_aligned(void* mem) { - void* ptr = reinterpret_cast(*reinterpret_cast(static_cast(mem)-sizeof(void*))); +#ifdef USE_STD_ALLOC_FREE +#if defined(_MSC_VER) +#ifdef DEBUG + _aligned_free_dbg(mem); +#else + _aligned_free(mem); +#endif +#else + free(mem); +#endif +#else + void* ptr = reinterpret_cast(*reinterpret_cast(static_cast(mem) - sizeof(void*))); free(ptr); +#endif }