diff options
author | Jacques Lucke <mail@jlucke.com> | 2019-08-20 10:45:47 +0300 |
---|---|---|
committer | Jacques Lucke <mail@jlucke.com> | 2019-08-20 10:45:47 +0300 |
commit | f2cab8267f22293fc28de9a87f81b535b7955020 (patch) | |
tree | 5dd67f14f132f3de4112279b7cc6070a34d1e4b0 /intern | |
parent | 6367845c5146acc371308847d70ed1065dbdde4c (diff) |
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
Diffstat (limited to 'intern')
-rw-r--r-- | intern/guardedalloc/intern/mallocn_guarded_impl.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/intern/guardedalloc/intern/mallocn_guarded_impl.c b/intern/guardedalloc/intern/mallocn_guarded_impl.c index 8ba14b3887b..ef74f394fb1 100644 --- a/intern/guardedalloc/intern/mallocn_guarded_impl.c +++ b/intern/guardedalloc/intern/mallocn_guarded_impl.c @@ -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, |