Memory: Fix guarded aligned malloc with small alignment
When calling `MEM_guarded_mallocN_aligned` with an alignment of 4, a pointer that was returned that is 4 byte but not 8 byte aligned. When freeing this pointer, `MEM_guarded_freeN` thinks that it is an illegal pointer, because it asserts that `((intptr_t)memh) & 0x7 == 0`. The fix is to always use at least 8 byte alignment. Reviewers: brecht Differential Revision: https://developer.blender.org/D5529
This commit is contained in:
@@ -552,7 +552,13 @@ void *MEM_guarded_malloc_arrayN(size_t len, size_t size, const char *str)
|
||||
|
||||
void *MEM_guarded_mallocN_aligned(size_t len, size_t alignment, const char *str)
|
||||
{
|
||||
MemHead *memh;
|
||||
/* We only support alignment to a power of two. */
|
||||
assert(IS_POW2(alignment));
|
||||
|
||||
/* Use a minimal alignment of 8. Otherwise MEM_guarded_freeN thinks it is an illegal pointer. */
|
||||
if (alignment < 8) {
|
||||
alignment = 8;
|
||||
}
|
||||
|
||||
/* It's possible that MemHead's size is not properly aligned,
|
||||
* do extra padding to deal with this.
|
||||
@@ -567,13 +573,10 @@ void *MEM_guarded_mallocN_aligned(size_t len, size_t alignment, const char *str)
|
||||
*/
|
||||
assert(alignment < 1024);
|
||||
|
||||
/* We only support alignment to a power of two. */
|
||||
assert(IS_POW2(alignment));
|
||||
|
||||
len = SIZET_ALIGN_4(len);
|
||||
|
||||
memh = (MemHead *)aligned_malloc(len + extra_padding + sizeof(MemHead) + sizeof(MemTail),
|
||||
alignment);
|
||||
MemHead *memh = (MemHead *)aligned_malloc(
|
||||
len + extra_padding + sizeof(MemHead) + sizeof(MemTail), alignment);
|
||||
|
||||
if (LIKELY(memh)) {
|
||||
/* We keep padding in the beginning of MemHead,
|
||||
|
Reference in New Issue
Block a user