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:
Jacques Lucke 2019-08-20 09:45:47 +02:00
parent 6367845c51
commit f2cab8267f
Notes: blender-bot 2023-02-14 09:38:57 +01:00
Referenced by issue #72991, Error: Not freed memory blocks (2.81a)/ Invalid, please ignore
Referenced by issue #69015, New Denoising feature in compositor is killing details
Referenced by issue #68911, blender2.81 crashes in edit mode by clicking left mouse button default instalation
1 changed files with 9 additions and 6 deletions

View File

@ -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,